2012-08-29 42 views
3

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

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

感谢您的帮助。

+0

我用一些代码更新了我的答案,以使您的SQL“占位符不可知”。 – 2012-08-30 10:01:16

回答

3

更新来解决我前面关于如何使用paramstyle全球

如果使用DB模块遵循Python Database API Specification v2.0错误,就可以得到模块全球paramstyle这应该是任何一个:

  1. 'qmark'问号风格, eg '...在哪里名字=?'
  2. 'numeric'数字,位置样式, 例如'... WHERE name =:1'
  3. ''命名为'Named style, '... WHERE name =:name'
  4. 'format'ANSI C printf format codes, '... 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 } 
+0

PEP没有提到*设置*它。事实上,PEP将其描述为**常数**。 –

+0

哦,你一定是对的。作为我,我会试试看,但你很可能是正确的。 – 2012-08-29 18:30:07

+0

是的,你的答案是正确的,你必须阅读价值并据此撰写他的陈述,而不是更新全球。 – 2012-08-29 18:35:55

2

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

+0

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