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

use*_*814 4 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
Run Code Online (Sandbox Code Playgroud)

此函数返回此错误:

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
Run Code Online (Sandbox Code Playgroud)

另外,以防万一:

id_name = 'pos_id'
table_name = 'Poscar'
Run Code Online (Sandbox Code Playgroud)

Dav*_*ver 5

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

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

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


And*_*ndy 5

您无法为列名或表名使用占位符.占位符用于从数据库插入或检索数据的值.图书馆正确清理它们.

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

db.execute('''SELECT max({}) FROM {}'''.format(id_name, table_name)).fetchone()[0]
Run Code Online (Sandbox Code Playgroud)

这将使用字符串格式来构建您的查询.如果您需要为此添加WHERE条件,您仍然可以使用参数执行此操作:

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