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

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)

我预计SELECT将以与INSERT相同的方式出现.对于这种行为,我能想到的唯一解释是,参数参数的数值被忽略了.为什么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相关问答推荐

使用Keras的线性回归参数估计

如何找到满足各组口罩条件的第一行?

管道冻结和管道卸载

通过pandas向每个非空单元格添加子字符串

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何在Python数据框架中加速序列的符号化

Python+线程\TrocessPoolExecutor

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

Django RawSQL注释字段

如何杀死一个进程,我的Python可执行文件以sudo启动?

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

如何创建引用列表并分配值的Systemrame列

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

Polars Group by描述扩展

将一个双框爆炸到另一个双框的范围内

如何从比较函数生成ngroup?

如何反转一个框架中列的值?

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

当lambda函数作为参数传递时,pyo3执行