2012-08-29 45 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如何逃脫?本身。 –