форматирование строки 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}'