我有一个元组列表:
list_ = [(1,7,3000),(1,8,3500), (1,9,3900)]
我想更新一个具有给定ID的多行/值的表(在这种情况下ID = 1)
所以:
INSERT INTO table (ID, Speed, Power) VALUES (1,7,3000),(1,8,3500),(1,9,3900)
我遇到了这种格式的问题 - 我已经把字符串搞得像这样了:
INSERT INTO ... VALUES ((1,7,3000),(1,8,3500),(1,9,3900))
但是当然这不起作用,因为元组周围有额外的括号。有什么想法构建一种“pythonically”的方法吗?
答案 0 :(得分:6)
嗯,你需要构建一行:
INSERT INTO ... VALUES (1,7,3000), (1,8,3500), (1,9,3900)
尝试一下:
rows = [(1,7,3000), (1,8,3500), (1,9,3900)]
values = ', '.join(map(str, rows))
sql = "INSERT INTO ... VALUES {}".format(values)
答案 1 :(得分:1)
在Python中处理此问题的惯用方式是使用所使用的数据库驱动程序提供的executemany中的cursor方法。
例如,对于使用标准库中的sqlite3模块的sqlite
conn = sqlite3.connect('/path/to/file.db')
cursor = conn.cursor()
sql = """INSERT INTO mytable (ID, Speed, Power) VALUES (?, ?, ?)"""
values = [(1,7,3000),(1,8,3500),(1,9,3900)]
cursor.executemany(stmt, values)
VALUES
子句中使用的占位符因特定驱动程序而异。正确的值可以在驱动程序的文档中找到,也可以通过查找驱动程序模块的paramstyle属性来找到。
使用这种方法代替字符串插值/格式化或f字符串可确保正确引用值,从而防止SQL注入和其他错误:
>>> conn = sqlite3.connect(':memory:')
>>> cur = conn.cursor()
>>> date = '2020-11-23'
>>> # Correctly quoted input is returned as the selected value
>>> cur.execute("""SELECT ? AS today""", (date,)) # <- execute requires a tuple as values
<sqlite3.Cursor object at 0x7f1fa205e1f0>
>>> cur.fetchone()
('2020-11-23',)
>>> # Unquoted input is evaluated as an expression!
>>> cur.execute(f"""SELECT {date} AS today""")
<sqlite3.Cursor object at 0x7f1fa205e1f0>
>>> cur.fetchone()
(1986,)