出于安全原因,Python 在输入查询之前会转义值,因此在某些地方无法使用值,因为它会创建错误的查询。
使用?=? 你期望column=value 但它会创建两个字符串"column"="value" 并且会产生错误。
出于安全原因,它还可能检查? 是否存在表名或列名并引发错误。
可能需要使用string formatting 或f-string 输入column。但这不是首选。查询不应使用? 作为表名、列名。
最小的工作示例。
它使用con.set_trace_callback(print) 显示最后一个查询。
import sqlite3
con = sqlite3.connect(":memory:")#
con.set_trace_callback(print)
cur = con.cursor()
cur.execute("CREATE TABLE test(key TEXT, value TEXT)")
print('---')
cur.execute("INSERT INTO test(key, value) VALUES (?, ?)", ("a", "1"))
con.commit()
print('---')
cur.execute("SELECT key, value FROM test WHERE key=?", ('a',))
row = cur.fetchone()
print(row)
print('---')
cur.execute("SELECT key, value FROM test WHERE ?=?", ('key', 'a'))
row = cur.fetchone()
print(row)
print('---')
try:
cur.execute("UPDATE test SET ?=? WHERE key=?", ('value', '3', 'a',))
con.commit()
except Exception as ex:
print('Exception:', ex)
print('---')
try:
column = 'value'
cur.execute(f"UPDATE test SET {column}=? WHERE key=?", ('3', 'a',))
con.commit()
except Exception as ex:
print('Exception:', ex)
print('---')
cur.execute("SELECT key, value FROM test WHERE key=?", ('a',))
row = cur.fetchone()
print(row)
print('---')
con.close()
示例WHERE key=?", ('a',) 创建WHERE key='a' 并获得一行。
示例 WHERE ?=?", ('key', 'a',) 创建 WHERE 'key'='a' 并获得零行。
示例SET ?=? 引发错误。
CREATE TABLE test(key TEXT, value TEXT)
---
BEGIN
INSERT INTO test(key, value) VALUES ('a', '1')
COMMIT
---
SELECT key, value FROM test WHERE key='a'
('a', '1')
---
SELECT key, value FROM test WHERE 'key'='a'
None
---
Exception: near "?": syntax error
---
BEGIN
UPDATE test SET value='3' WHERE key='a'
COMMIT
---
SELECT key, value FROM test WHERE key='a'
('a', '3')