用'?' sqlite3语句中的占位符

时间:2015-07-07 18:53:27

标签: python sqlite

因此,出于某种原因,我在select语句中使用占位符时遇到错误。

def get_id(table_name, id_name):
    db = sqlite3.connect('test_db')
    max_id = db.execute('''SELECT max(?) FROM ?''', (id_name, table_name)).fetchone()[0]
    if not max_id:
        primary_id = 0
    else:
        primary_id = max_id + 1

此函数返回此错误:

File "test.py", line 77, in get_id
max_id = db.execute('''SELECT max(?) FROM ?''', (id_name, table_name)).fetchone()[0]
sqlite3.OperationalError: near "?": syntax error

另外,以防万一:

id_name = 'pos_id'
table_name = 'Poscar'

2 个答案:

答案 0 :(得分:5)

您无法使用占位符作为列名或表名。占位符用于从数据库插入或检索数据的值。图书馆正确地对它们进行消毒。

要做你想做的事,试试这样的事情:

db.execute('''SELECT max({}) FROM {}'''.format(id_name, table_name)).fetchone()[0]

这将使用string formatting来构建您的查询。如果您需要为此添加WHERE条件,您仍然可以使用参数执行此操作:

db.execute('''SELECT max({}) FROM {} WHERE ID = ?'''.format(id_name, table_name), id_variable).fetchone()[0]

答案 1 :(得分:3)

您看到此错误,因为占位符只能用于替换值,而不能替换列名或表名。

在这种情况下,您将不得不使用Python的字符串格式,要非常小心这些值不包含SQL或特殊字符:

max_id = db.execute(
    'SELECT max(%s) FROM %s where foo > ?' %(id_name, table_name),
    (max_foo_value, ),
)