得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

sqlite3 占位符引发的惨案

记录一下在 python 中调用 sqlite3 使用 like 进行模糊查询时引发的惨案

一条普通的 sqlite3 like 查询语法如下:

1
SELECT name FROM id_data WHERE name LIKE "%1%"

在 py 代码中,使用 sqlite3 的查询语句想当然的变成下面这样:

1
2
3
conn.execute(
'SELECT name FROM database WHERE name LIKE "%?%"', (value,)
)

然鹅,执行以后报错了

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

不对呀,我明明用了一个占位符,为啥说不需要用参数呢

终于,在网上找到解释,因为 statement 占位符 “?” 处在双引号和单引号的双重包裹之中,检测不出来是个占位符

那咋办,直接用 python 的字符串操作?

1
2
3
conn.execute(
f'SELECT name FROM database WHERE name LIKE "%{key}%"'
)

看样子,好像也能解决,但是,占位符的作用好像是避免 sql 注入的安全问题,那怎么用占位符写?

1
2
3
conn.execute(
'SELECT name FROM database WHERE name LIKE ?', (f'%{key}%',)
)

事实上,用 execute 并不能执行多条语句,即使直接用上面那种字符串操作解决,似乎也没有什么问题?

be slow to promise and quick to perform.