python sqlite qmark "consume" 参数

python sqlite qmark "consume" parameters

我的python代码:

datefilter="2022-01-11"
if condition:
  sql="SELECT * FROM TABLE;"
else:
  sql="SELECT * FROM TABLE WHERE DATE = ?;"
curs.execute(sql,(datefilter,))

当条件为真时我得到的错误:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied.

有没有办法在不将其用于 sql 查询的情况下“使用”此参数?

我已经尝试了以下方法,但它不起作用:

sql="SELECT * FROM TABLE; -- ?"

任何不计算为 0 的非空表达式,当用作布尔表达式时被解释为 false,可以在任何您希望计算为 [=16] 的地方使用=].

这个查询:

SELECT * FROM TABLE;

相当于:

SELECT * FROM TABLE WHERE '2022-01-11'; -- yes, this is valid in SQLite

因为'2022-01-11'被隐式转换为非零数值(=2022'2022-01-11'的起始数字部分),所以被解释为true,使查询等同于:

SELECT * FROM TABLE WHERE TRUE;

对于您的情况,假设您传递的参数是一个日期,以便在如上所述使用时它将始终转换为 true,您可以编写如下代码:

datefilter="2022-01-11"
if condition:
  sql="SELECT * FROM TABLE WHERE ?;"
else:
  sql="SELECT * FROM TABLE WHERE DATE = ?;"
curs.execute(sql,(datefilter,))