Python sqlite3 占位符

Posted

技术标签:

【中文标题】Python sqlite3 占位符【英文标题】:Python sqlite3 placeholder 【发布时间】:2012-08-24 10:16:50 【问题描述】:

有没有办法为 sqlite3 中的查询设置占位符? 我有一些可以与数据库一起使用的函数,如果它们可以同时与 mysql 和 sqlite 一起使用会更令人满意。 Mysql 和 Postgres python apis 使用 %s 作为占位符,但是 sqlite3 使用问号代替。

我正在寻找一种方法来使用相同的占位符,无论数据库引擎如何。

感谢您的帮助。

【问题讨论】:

我用一些代码更新了我的答案,以使您的 SQL“与占位符无关”。 【参考方案1】:

已更新以修复我之前关于如何使用 paramstyle 全局的错误

如果您使用的 DB 模块遵循 Python Database API Specification v2.0,您可以获得模块全局 paramstyle,它应该是以下任何一个:

    'qmark' 问号样式, 例如'...WHERE name=?' 'numeric' 数字,位置样式, 例如'...WHERE name=:1' 'named' 命名样式, 例如'...WHERE name=:name' 'format' ANSI C printf 格式代码, 例如'...WHERE name=%s' 'pyformat' Python 扩展格式代码, 例如'...WHERE name=%(name)s'

然后,您可以使用模块使用的占位符来编写 SQL 语句。你可以这样做:

import sqlite3

paramstyle = sqlite3.paramstyle

if paramstyle == 'qmark':
    ph = "?"
elif paramstyle == 'format':
    ph = "%s"
else:
    raise Exception("Unexpected paramstyle: %s" % paramstyle)

sql = "INSERT INTO foo VALUES (%(ph)s, %(ph)s, %(ph)s)" %  "ph" : ph 

【讨论】:

PEP 中没有提及设置它。事实上,PEP 将其描述为一个常量 哦,你一定是对的。作为我,我会尝试看看,但你很可能是正确的。 是的,您的答案是正确的,必须阅读该值并相应地撰写他的陈述,而不是更新全局。【参考方案2】:

底层库doesn't support %s,所以需要手动替换。检查paramstyle 属性并将查询中不同占位符的所有实例替换为适当的值可能会更容易。

【讨论】:

我明白了。我将创建一个函数,将带有 %s 的查询转换为带有问号的查询。然而,这并不像听起来那么容易。我找不到 sqlite 如何逃脱?本身。

以上是关于Python sqlite3 占位符的主要内容,如果未能解决你的问题,请参考以下文章

Python sqlite3 构建带有动态占位符的部分

记录 splite3 库的一个坑(表名和字段定义不能用占位符?)

python 中向sqlite 插入数据时,使用占位符出现问题

python中的占位符

小白的python进阶历程------05.占位符

python占位符使用