字符串格式化sqlite3中的SQL查询

时间:2015-06-20 23:30:54

标签: python sqlite

我一直在使用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查询进行字符串格式化?

3 个答案:

答案 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)