Python sqlite3占位符

Joh*_*nal 5 python mysql sqlite placeholder

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

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

谢谢你的帮助.

小智 5

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

如果您使用的数据库模块遵循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 }
Run Code Online (Sandbox Code Playgroud)

  • PEP 中没有提到*设置*它。事实上,PEP 将其描述为**常量**。 (2认同)

Ign*_*ams 5

底层库不支持%s,因此需要手动替换.检查paramstyle属性并使用适当的值替换查询中的其他占位符的所有实例可能更容易.