python - 为什么Python的sqlite3模块不尊重位置参数的顺序?

标签 python sqlite prepared-statement

最近我遇到了以下奇怪的行为,可以通过以下代码示例进行解释:

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})

阅读https://www.sqlite.org/lang_expr.html#varparam

关于python - 为什么Python的sqlite3模块不尊重位置参数的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73229042/

相关文章:

ios - 如何在 iOS/Swift 中存储并保存更新的问题和答案集

php - mysqli准备好的语句和事务可以一起使用吗?

php - PDO、多语句和竞争条件

python - 使用 Selenium 单击元素后如何使用 xsel 提取剪贴板内容

java - android SqLite AutoCompleteTextView

python - 将 Popen.communicate() 输出与正则表达式匹配不起作用

Android - 为 map 或图片设计数据库?

java - 如何从Mysql表中删除一个匹配项?

python子进程缺少参数

python - Python 中的高性能模糊字符串比较,使用 Levenshtein 或 difflib