2016-11-22 4 views
2

Ich versuche, eine SQL-Abfrage in PyQt5 zu schreiben, das einige Daten in einer Tabelle aktualisiert, sondern kann die Abfrage nicht zur Arbeit bekommen. Ich habe unzählige Foren gelesen, aber soweit ich das beurteilen kann, ist mein Code korrekt. Ich habe auch die Dokumentation von hinten nach vorne gelesen, vielleicht verpasse ich etwas?PyQt SQL Query mit Bindings

Ich bin mit PyQt5, python3.5 und SQLite. Der folgende Code (LetzteFehlerNr/lastQuery nicht dargestellt):

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_() 

... erzeugt den Fehler:

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 

Habe ich den Faden verloren? Was vermisse ich?

Vielen Dank im Voraus.

+1

nur eine Vermutung, da ich nie PyQt5 verwendet haben : Benötigen Sie Escapezeichen (einfache oder doppelte Anführungszeichen) um die Platzhalter in der UPDATE-Anweisung für die Zeichenfolgenwerte? –

Antwort

4

Ein Tabellenname ist kein Parameter, daher können Sie keinen Wert an ihn binden. Platzhalter sind für die Verwendung mit Literalwerten und nicht für willkürliche Zeichenfolgen vorgesehen. Für letztere sollten Sie nur normale String-Interpolation verwenden:

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

Für eine allgemeinere Art und Weise Kennungen zu entkommen, verwenden Sie die Abfrage driver:

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

Das ist perfekt. Ich nahm nur an, dass der Tabellenname als Parameter enthalten war, ist das eine SQL-Sache? (Mein SQL-Wissen ist sehr begrenzt). – NineTails

+0

@NineTails. Parameter sind dynamische * runtime * Variablen. Bezeichner (wie Tabellennamen) sind statisch und müssen zur * Kompilierungszeit * bekannt sein (d. H. Wenn die Anweisung vorbereitet ist). Eine vorbereitete Aussage ist wie ein Ausdruck in der Algebra. Das Ändern der * Literalwerte * der Variablen ergibt immer die gleiche Art von Ergebnis; aber das Ändern der * Namen der Variablen * wird wahrscheinlich nicht. – ekhumoro