所以出于某种原因,我在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)
您看到此错误是因为占位符只能用于替换值,而不能用于替换列或表名称。
在这种情况下,您必须使用 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)
您无法为列名或表名使用占位符.占位符用于从数据库插入或检索数据的值.图书馆正确清理它们.
要做你想做的事,尝试这样的事情:
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)