6

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

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

谢谢你的帮助。

4

2 回答 2

5

更新以修复我之前关于如何使用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 }
于 2012-08-29T18:26:43.660 回答
5

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

于 2012-08-29T18:30:28.087 回答