форматирование строки sql-запроса в sqlite3
Я играл с sqlite3, и я получаю и sqlite3.OperationalError: рядом с "sweet": синтаксическая ошибка для этой строки моего кода query_cursor.execute("INSERT INTO mcdonalds_menu VALUES(%d, %s, %f, %s, %d)" % (ids[num],names[num], price[num], descriptions[num], calories[num]))
когда я помещаю значения в 3 отдельных запроса, код, кажется, работает, но я пытаюсь сохранить свой код более сухим, используя цикл for. Код пока:
import sqlite3
filename = sqlite3.connect("McDonalds_Menu.db")
query_cursor = filename.cursor()
def create_table():
query_cursor.execute( "CREATE TABLE mcdonalds_menu (id INTEGER, name VARCHAR(20), price DECIMAL(3, 2), description TEXT, calories INTEGER)")
ids = range(1,4)
names = ["McFlurry", "Fillet-o-Fish", "McCafe"]
price = 1.50, 2.25, 0.99
descriptions = ["Delicious sweet icecream", "Best fish in the sea", "Freshly brewed Colombian coffee"]
calories = 220, 450, 75
def data_entry():
for num in xrange(3):
query_cursor.execute("INSERT INTO mcdonalds_menu VALUES(%d, %s, %f, %s, %d)" % (ids[num], names[num], price[num], descriptions[num], calories[num]))
filename.commit()
if __name__ == "__main__":
create_table()
data_entry()
можно ли форматировать строку sql-запроса с помощью цикла?
2 ответов
SQL нужны строки в VALUES
в кавычки. Целые числа и поплавки не нуждаются в кавычках.
в комментариях ниже обратите внимание, что SQL VALUES
содержит строки без кавычек для "Fillet-o-Fish" и "Best fish in the sea":
sql = "INSERT INTO mcdonalds_menu VALUES(%d, %s, %f, %s, %d)".format(ids[num], names[num], price[num], descriptions[num], calories[num])
# INSERT INTO mcdonalds_menu VALUES(2, Fillet-o-Fish, 2.250000, Best fish in the sea, 450)
добавление некоторых экранированных кавычек вокруг строковых значений создает допустимый SQL:
sql = "INSERT INTO mcdonalds_menu VALUES(%d, \"%s\", %f, \"%s\", %d)" % (ids[num],names[num], price[num], descriptions[num], calories[num])
# INSERT INTO mcdonalds_menu VALUES(2, "Fillet-o-Fish", 2.250000, "Best fish in the sea", 450)
С Python 3.6+ вы можете упростить этот беспорядок цитирования с помощью F строк. Например:
c.execute(f"select sql from sqlite_master where type='table' and name='{table_name}';")
for r in c.fetchall():
print(r)
в этом фрагменте важно отметить:f
перед строкой sql. Это позволяет передавать переменные, окруженные фигурными скобками, в моем примере: '{table_name}'