计算Pysqlite3中的行数

时间:2016-04-25 14:54:53

标签: pysqlite

我必须在python sqlite3上编写一个函数来计算表的行数。 问题是用户应该在执行函数后输入该表的名称。 到目前为止,我有以下内容。但是,我不知道如何将变量(表)与函数“连接”,一旦执行它。 任何帮助都会很棒。 感谢

def RT():
    import sqlite3
    conn= sqlite3.connect ("MyDB.db")
    table=input("enter table name: ")
    cur = conn.cursor()
    cur.execute("Select count(*) from  ?", [table])
    for row in cur:
        print str(row[0])
    conn.close()

1 个答案:

答案 0 :(得分:0)

列和表不能参数化

this SO answer中所述,无法对列和表进行参数化。一个事实可能没有任何权威来源记录(我找不到一个,所以如果你知道一个请编辑这个答案和/或上面链接的那个),而是通过完全尝试的人学习在问题中尝试了什么。

动态插入列或表名的唯一方法是通过标准的python字符串格式化:

cur.execute("Select count(*) from {0}".format(table))

不幸的是,这可以让您了解 SQL注入

的可能性

白名单可接受的列/表名

This SO answer说明您应该使用白名单来检查可接受的表名。这就是你的样子:

import sqlite3

def RT():
    conn = sqlite3.connect ("MyDB.db")
    table = input("enter table name: ")
    cur = conn.cursor()
    if table not in ['user', 'blog', 'comment', ...]:
        raise ... #Include your own error here
    execute("Select count(*) from {0}".format(table))
    for row in cur:
        print str(row[0])
    conn.close()

相同的SO回答警告直接接受提交的名称" 因为验证和实际表格可能不同步,或者您可能忘记检查。"这意味着,您应该只自己获取表的名称。您可以通过明确区分接受用户输入和实际查询来实现此目的。以下是您可能会做的一个示例。

import sqlite3

acceptable_table_names = ['user', 'blog', 'comment', ...]

def RT():
    """ 
    Client side logic: Prompt the user to enter table name.
    You could also give a list of names that you associate with ids
    """
    table = input("enter table name: ")
    if table in acceptable_table_names:
        table_index = table_names.index(table)
        RT_index(table_index)        

def RT_index(table_index):
    """ 
    Backend logic: Accept table index instead of querying user for 
    table name.
    """
    conn = sqlite3.connect ("MyDB.db")
    cur = conn.cursor()
    table = acceptable_table_names[table_index]
    execute("Select count(*) from {0}".format(table))
    for row in cur:
        print str(row[0])
    conn.close()

这可能看起来很无聊,但这可以保留原始界面,同时解决忘记检查白名单的潜在问题。验证和实际表格仍可能不同步;你需要编写测试来对抗它。