我一直在玩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()
Run Code Online (Sandbox Code Playgroud)
是否可以使用循环字符串格式化SQL查询?
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)
Run Code Online (Sandbox Code Playgroud)
在字符串值周围添加一些转义的引号会产生有效的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)
Run Code Online (Sandbox Code Playgroud)
依赖 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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3743 次 |
最近记录: |