2016-11-22 7 views
2

Я пытаюсь написать SQL-запрос в PyQt5, который обновляет некоторые данные в таблице, но не может заставить запрос работать. Я читал бесчисленные форумы, но, насколько я могу судить, мой код верен. Я также прочитал документацию на фронт, так что, может быть, я что-то упустил?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 : вам нужны escape-символы (одиночные или двойные кавычки) вокруг заполнителей в инструкции 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. Параметры - это динамические переменные * runtime *. Идентификаторы (такие как имена таблиц) являются статическими и должны быть известны в момент * компиляции * (т. Е. Когда оператор готов). Подготовленный оператор похож на выражение в алгебре. Изменение * буквенных значений * переменных всегда даст один и тот же результат; но изменение * имен переменных *, вероятно, не будет. – ekhumoro

 Смежные вопросы

  • Нет связанных вопросов^_^