因此,出于某种原因,我在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'
答案 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, ),
)