python - pysqlite 用户在 select 语句中键入

标签 python sqlite pysqlite

使用 pysqlite 如何将用户定义类型用作比较中的值,例如。 g:“... WHERE 列名称 > 用户类型”?

例如,我定义了一个具有必要注册、转换器等的 bool 类型。Pysqlite/Sqlite 按预期响应 INSERT 和 SELECT 操作(bool 'True' 存储为整数 1 并返回为 True)。

但是当 bool 用于“SELECT * fromtask WHERE display = True”或“... WHERE display = 'True'”时,它会失败。 “在第一种情况下,Sqlite 报告错误,指出不存在名为 True 的列。在第二种情况下,不会返回任何记录。如果使用 1 代替 True,则该选择有效。我在使用 pysqlite 自己的日期和时间戳适配器时似乎遇到了同样的问题。

我可以针对此用户类型和其他用户类型解决此行为,但这并不那么有趣。我想知道在查询中是否可以使用用户定义的类型,这样我就不会一直用头撞这堵特定的墙。

谢谢。

最佳答案

使用向查询传递变量的正确方法:不要构建查询,使用问号并将参数作为元组传递给 execute()

myvar = True
cur.execute('SELECT * FROM tasks WHERE display = ?', (myvar,))

这样 sqlite 驱动程序将直接使用该值。不再需要转义、引用、转换。

对每个参数都使用这种技术,甚至是字符串、整数等。这样您就可以自动避免 SQL 注入(inject)。

关于python - pysqlite 用户在 select 语句中键入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/609516/

相关文章:

python - 哪个更好-execute(INSERT) 或executemany(INSERT)

python - 使用 x,y,z 排序将 1D numpy 数组 reshape 为 3D

mysql - 如何删除相同的子查询,之后我想要相同的结果

ruby-on-rails-3 - 导入 csv 文件后,在我的 sqlite db 表中创建了额外的行

sql - 从未提交的事务中恢复数据库行

python - 找不到符号 : _sqlite3_enable_load_extension - sqlite installed via homebrew

python - 为什么 python setup.py 在 Travis CI 上说无效命令 'bdist_wheel'?

python 密码库 : what is the best value for "rounds"

python - geckodriver 没有在 ubuntu 上使用 selenium 和 django 打开 firefox

sql - elisp 有原生的 sqlite 绑定(bind)吗?