python - 使用python在sqlite select查询中动态搜索null

标签 python sqlite null sql-injection

我是 python 新手,我想做一个类似的查询:

_c.execute('select * from cases where bi = ? and age = ? and 
            shape = ? and margin = ? and density = ?',(obj['bi'], 
            obj['age'], obj['margin'], obj['density']))

当部分参数为None时,例如 obj['bi'] = None ,查询搜索 bi = 'None' 时的行.但我希望它在以下情况下搜索该行:'bi is NULL'
一种可能的解决方案是在一系列 if-else 中逐一验证参数的值。例如:
query = 'select * from cases where'

if obj['bi'] is None:
   query += ' bi is null'
else:
   query += ' bi = ' + str(obj['bi']) + ' and '
    ...
# do the same if-else for the other parameters
    ...

_c.execute(query)

但是,在我看来,这并不是最好的解决方案。
问题是,给定问题的最佳解决方案是什么以及如何避免 SQL 注入(inject)。

最佳答案

好的,在启动了一个 python REPL 并玩了一下之后,它比我想象的要简单。 Python sqlite 绑定(bind)将 Python None进入 SQL NULL ,而不是字符串 'None'就像你的问题听起来一样。在 SQL 中,=不匹配 NULL值,但 IS将要。所以...

给定一张表foo看起来像:

a     | b
--------------
NULL  | 1
Dog   | 2     

正在做:
c = conn.cursor()
c.execute('SELECT * FROM foo WHERE a IS ?', (None,))
print(c.fetchone())

将返回 (NULL, 1)行,和
c.execute('SELECT * FROM foo WHERE a IS ?', ('Dog',))
print(c.fetchone())

将返回 ('Dog', 2)排。

换句话说,使用 IS不是 =在您的查询中。

关于python - 使用python在sqlite select查询中动态搜索null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437461/

相关文章:

mysql - SQL 查询为我提供总数

android - 有没有办法在android studio中将音频文件转换为字节数组

ios - 检查 NSMutableArray 元素是否存在

python - 解码从 HTTP 流中提取的 Cookie 变量 - Python

python - 限制一次运行的最大线程数的正确方法?

SQLite:优化表扫描

c# - 目录列表递归

Android SQLite 选择 IS NOT NULL

python - 从 python 中的数据框中删除多列

python - 使用 SQLALCHEMY 设置 Oracle VARCHAR2 长度 i 字节