2016-04-26 7 views
1

Ok поэтому в основном я пытаюсь обновить существующую SQLite3 базы данных с переменными экземпляра (тип и лвл)Использование переменных экземпляра в обновлении SQLite3?

#Set variables 
typ = 'Test' 
lvl = 6 

#Print Databse 
print("\nHere's a listing of all the records in the table:\n") 
for row in cursor.execute("SELECT rowid, * FROM fieldmap ORDER BY rowid"): 
    print(row) 

#Update Info 
sql = """ 
UPDATE fieldmap 
SET buildtype = typ, buildlevel = lvl 
WHERE rowid = 11 
""" 

cursor.execute(sql) 

#Print Databse 
print("\nHere's a listing of all the records in the table:\n") 
for row in cursor.execute("SELECT rowid, * FROM fieldmap ORDER BY rowid"): 
    print(row) 

Как ошибки я получаю

sqlite3.OperationalError: no such column: typ 

Теперь я в основном знаю проблему заключается в том, что моя переменная вставлена ​​с неправильным синтаксисом, но я не могу для жизни меня найти правильный. Он работает со строками и Интсом просто отлично, как это:

sql = """ 
UPDATE fieldmap 
SET buildtype = 'house', buildlevel = 3 
WHERE rowid = 11 
""" 

Но как только я переключаюсь на переменный он выдает ошибку.

ответ

2

Ваш запрос на самом деле не вставляет значения переменных typ и lvl в строку запроса. Как написано, запрос пытается ссылаться на столбцы с именем typ и lvl, но они не существуют в таблице.

Try Сочинение как параметризованные запрос:

sql = """ 
UPDATE fieldmap 
SET buildtype = ?, buildlevel = ? 
WHERE rowid = 11 
""" 

cursor.execute(sql, (typ, lvl)) 

В ? действует как заполнитель в строке запроса, который заменяется значениями в кортеже, переданного execute(). Это безопасный способ создания запроса и избежания уязвимостей SQL-инъекций.

-1

Эй, я думаю, вы должны использовать ORM для работы с базой данных SQL.

SQLAlchemy - ваш друг. Я использую это с SQLite, MySQL, PostgreSQL. Это фантастически.

Это может заставить вас уйти от этой синтаксической ошибки, поскольку SQL действительно делает запятые и кавычки важными.

Для жесткого кодирования, вы можете попробовать это:

sql = """ 
UPDATE fieldmap 
SET buildtype = '%s', buildlevel = 3 
WHERE rowid = 11 
""" % (house) 

Это может решить проблему временно, но не в долгосрочной перспективе. ORM - ваш друг.

Надеюсь, это может быть полезно!

+0

Хорошо звучит многообещающе, я посмотрю! – Syntic

+0

** НИКОГДА не используйте '% s' или' str.format' в командах SQL, переданных в вашу базу данных. Он подвержен SQL-инъекции. – aim100k

+0

@ aim100k Да, мы знаем. Вот почему мы используем ORM вместо жесткого кодирования. Тем не менее, люди, которые в основном заботятся об инъекции, будут делать собственные SQL ORM, кроме использования SQLAlchemy. – dotslash