2016-11-22 69 views
2

我想在PyQt5中編寫一個SQL查詢來更新表中的某些數據,但無法使查詢工作。我讀過無數論壇,但據我所知,我的代碼是正確的。我也已經閱讀了文檔,所以也許我錯過了一些東西?PyQt SQL查詢綁定

我正在使用PyQt5,python3.5和SQLITE。下面的代碼(lastError/lastQuery未顯示):

self.sqlWrite('ct','MarkerSize',123) 

def sqlWrite(self,tbl,var,val): 
     query = QtSql.QSqlQuery(self.db) # First create query instance. 
     # Prepare query with placeholders, then bind values. 
     query.prepare('UPDATE :tbl SET value=:val WHERE property=:var') 
     query.bindValue(0,tbl) 
     query.bindValue(1,val) 
     query.bindValue(2,var) 
     # Finally execute query. 
     query.exec_() 

...產生錯誤:

near "?": syntax error Unable to execute statement 
near "?": syntax error Unable to execute statement 
UPDATE :tbl SET value=:val WHERE property=:var 
Parameter count mismatch 

有我失去的情節?我錯過了什麼?

在此先感謝。

+1

只是一個猜測,因爲我從來沒有使用過PyQt5 :在字符串值的UPDATE語句的佔位符周圍是否需要轉義字符(單引號或雙引號)? –

回答

4

表名不是一個參數,所以你不能綁定一個值。佔位符旨在用於字面值,而不是任意字符串。對於後者,你應該只使用普通的字符串插值:

query.prepare('UPDATE "%s" SET value=:val WHERE property=:var' % tbl) 
    query.bindValue(':val', val) 
    query.bindValue(':var', var) 

對於一個更通用的方式來逃避標識符,使用查詢的driver

tbl = query.driver().escapeIdentifier(tbl, QSqlDriver.TableName) 
    query.prepare('UPDATE %s SET value=:val WHERE property=:var' % tbl) 
+0

這是完美的。我只是假設表名被包含作爲參數,這是一個SQL的東西? (我的SQL知識非常有限)。 – NineTails

+0

@NineTails。參數是dynamic * runtime *變量。標識符(如表名)是靜態的,需要在*編譯時*知道(即語句準備好的時候)。準備好的陳述就像代數中的表達。更改變量的*文字值*將始終給出相同的結果類型;但更改變量的*名稱可能不會。 – ekhumoro