2016-11-22 8 views
2

テーブル内の一部のデータは更新されますが、クエリが機能しないSQLクエリをPyQt5に書き込もうとしています。私は無数のフォーラムを読んだが、私のコードが正しいと言うことができる限り、私はまた、ドキュメントを前に読んだので、多分私は何かを欠いている?バインディングを使用したPyQt SQLクエリ

私はPyQt5、python3.5およびSQLITEを使用しています。次のコード(最終エラー/ 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

ただの推測:クエリのdriverを使用し、識別子を逃れるために、より汎用的な方法について

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

:後者の場合は、あなただけの通常の文字列補間を使用する必要があります:文字列値のUPDATE文でプレースホルダの周りにエスケープ文字(一重引用符または二重引用符)が必要ですか? –

答えて

4

テーブル名はパラメータではないため、値をバインドすることはできません。プレースホルダは、任意の文字列ではなく、リテラル値での使用を意図しています。私はPyQt5を使ったことがないことから、

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

これは完璧です。私はテーブル名がパラメータとして含まれていると仮定しましたが、これはSQLのものですか? (私のSQL知識は非常に限られています)。 – NineTails

+0

@NineTails。パラメータは動的*ランタイム*変数です。識別子(テーブル名など)は静的で、*コンパイル時*(つまり、文が準備されているとき)に知る必要があります。準備されたステートメントは、代数の式に似ています。変数の*リテラル値*を変更すると、常に同じ種類の結果が得られます。変数の*名前を変更すると*おそらくそうではありません。 – ekhumoro

関連する問題