我一直在使用sqlite3,我得到了一个 sqlite3.OperationalError:near“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查询进行字符串格式化?
答案 0 :(得分:3)
SQL需要引用VALUES
中的字符串。整数和浮点数不需要引用。
在下面的注释输出中,请注意SQL VALUES
包含“Fillet-o-Fish”和“海洋中最好的鱼”的未加引号的字符串:
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)
答案 1 :(得分:0)
使用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)
在此代码段中,要注意的重要事项是sql字符串之前的f
。在我的示例中,这允许传入大括号包围的变量,例如:“ {table_name}”
答案 2 :(得分:0)
所有其他依赖python的字符串操作的答案都是不安全的,可能无法正确转义字符串中的引号。
如sqlite3
文档中所建议的那样,最好的方法是使用DB-API的参数替换。在您的示例中,它看起来像这样:
menu_items = [(1, 'McFlurry', 1.5, 'Delicious sweet icecream', 220),
(2, 'Fillet-o-Fish', 2.25, 'Best fish in the sea', 450),
(3, 'McCafe', 0.99, 'Freshly brewed Colombian coffee', 75)
]
c.executemany('INSERT INTO mcdonalds_menu VALUES (?,?,?,?,?)', menu_items)