最近我遇到了以下奇怪的行为,可以通过以下代码示例进行解释:
import sqlite3, platform
insert = (10, "today")
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE t (number, string)")
db.execute("INSERT INTO t (string, number) VALUES ($2, $1)", insert)
select = db.execute("SELECT number, string FROM t").fetchone()
print(f"python version: {platform.python_version()}")
print(f"sqlite version: {sqlite3.sqlite_version}, module: {sqlite3.version}")
print(f"insert: {insert}")
print(f"select: {select}")
python version: 3.10.5
sqlite version: 3.38.5, module: 2.6.0
insert: (10, 'today')
select: ('today', 10)
我希望选择的结果与插入的结果相同。我能想到的对此行为的唯一解释是参数参数的数值被忽略。为什么 Python 会忽略顺序?
最佳答案
您在这里混合了两种不同的使用参数的方式:
db.execute("INSERT INTO t (string, number) VALUES ($2, $1)", insert)
如果将 ($2, $1)
反转为 ($1, $2)
,您将得到相同的结果。
但是,如果你使用这个:
db.execute("INSERT INTO t (string, number) VALUES (?2, ?1)", insert)
然后你就会得到你所期望的。
$
格式用于命名参数,例如:
db.execute("INSERT INTO t (string, number) VALUES ($s, $n)", {'s': 'today', 'n': 10})
关于python - 为什么Python的sqlite3模块不尊重位置参数的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73229042/