Python sqlite3占位符

7
有没有一种方法可以在sqlite3中设置查询的占位符? 我有一些与数据库一起使用的函数,如果它们可以同时与mysql和sqlite一起使用,那将更加令人满意。 Mysql和Postgres Python API使用%s作为占位符,但是sqlite3使用问号代替。 我正在寻找一种使用相同占位符的方法,无论使用哪个数据库引擎。 感谢您的帮助。

我更新了我的答案,并添加了一些代码,使您的SQL“占位符不可知”。 - user610650
2个回答

6

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

如果您使用的DB模块遵循Python数据库API规范v2.0,则可以获取模块全局变量paramstyle,应该是以下任意一种:

  1. 'qmark' 问号样式, 例如'...WHERE name=?'
  2. 'numeric' 数字,位置样式, 例如'...WHERE name=:1'
  3. 'named' 命名样式, 例如'...WHERE name=:name'
  4. 'format' ANSI C printf格式代码, 例如'...WHERE name=%s'
  5. '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 }

2
PEP 中没有提到 设置 它。实际上,PEP 将其描述为 常量 - Ignacio Vazquez-Abrams
哦,你一定是对的。作为我,我会尝试一下,但你很可能是正确的。 - user610650
是的,你的答案是正确的。一个人必须读取值并相应地组成语句,而不是更新全局变量。 - user610650

5
底层库不支持%s,因此需要手动替换。更简单的方法是检查paramstyle属性,并将查询中不同占位符的所有实例替换为相应的值。

我明白了。我将创建一个函数,将带有%s的查询转换为带有问号的查询。但是,这并不像听起来那么简单。我找不到sqlite如何转义?本身的方法。 - John Smith Optional

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接