python sqlite3 executemany 使用多个列表
python sqlite3 executemany using multiple lists
背景:
所以我有一个大数组,我正在从一个来源读取并尝试使用 python.
写入(有效地)到 SQLite3 中
目前我使用默认的形式:
cursor.executemany("INSERT into mytable1 VALUES(?,?,?)", my_arr.tolist())
现在想扩容到几十万张表。我希望能够执行以下操作(希望):
cursor.executemany("INSERT into ? VALUES(?,?,?)", TableNameList, my_arr.tolist())
问题:
- 有没有办法在不向数组中插入列的情况下做到这一点
在将其转换为列表之前?什么?
- 如果没有这样的方法,那么建议和替代方案是
请求。
我试着查看 stackexchange,但可能遗漏了一些东西。
我试着查看 Python SQLite 文档,但没有看到类似的内容。
我尝试了通用 google 搜索。
首先,Python 位。假设 my_arr
是某种二维数组,并且 .tolist()
生成一个列表列表,是的,有一种方法可以向列表中的每一行添加一个元素:
result = [[a]+b for a,b in zip(TableNameList, my_arr.tolist()]
其次,SQL位。不,您不能使用 ?
来指定 table 名称。 table 名称必须按字面意思出现在 SQL 语句中。我能给你的最好的是 运行 curssor.execute
几次:
for table, values in zip(TableNameList, my_arr):
c.execute("INSERT INTO %s VALUES (?, ?, ?)"%table, values)
但是,请注意您是否信任 TableNameList
的来源。在 %s
中使用不受信任的数据会导致 SQL 注入安全漏洞。
示例程序:
import sqlite3
import numpy as np
import itertools
my_arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
TableNameList = 't1', 't1', 't2', 't3'
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''CREATE TABLE t1 (c1, c2, c3)''')
c.execute('''CREATE TABLE t2 (c1, c2, c3)''')
c.execute('''CREATE TABLE t3 (c1, c2, c3)''')
## Insert a row of data
#c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
for table, values in itertools.izip(TableNameList, my_arr):
c.execute("INSERT INTO %s VALUES (?, ?, ?)"%table, values)
# Save (commit) the changes
conn.commit()
# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()
背景:
所以我有一个大数组,我正在从一个来源读取并尝试使用 python.
目前我使用默认的形式:
cursor.executemany("INSERT into mytable1 VALUES(?,?,?)", my_arr.tolist())
现在想扩容到几十万张表。我希望能够执行以下操作(希望):
cursor.executemany("INSERT into ? VALUES(?,?,?)", TableNameList, my_arr.tolist())
问题:
- 有没有办法在不向数组中插入列的情况下做到这一点 在将其转换为列表之前?什么?
- 如果没有这样的方法,那么建议和替代方案是 请求。
我试着查看 stackexchange,但可能遗漏了一些东西。
我试着查看 Python SQLite 文档,但没有看到类似的内容。
我尝试了通用 google 搜索。
首先,Python 位。假设 my_arr
是某种二维数组,并且 .tolist()
生成一个列表列表,是的,有一种方法可以向列表中的每一行添加一个元素:
result = [[a]+b for a,b in zip(TableNameList, my_arr.tolist()]
其次,SQL位。不,您不能使用 ?
来指定 table 名称。 table 名称必须按字面意思出现在 SQL 语句中。我能给你的最好的是 运行 curssor.execute
几次:
for table, values in zip(TableNameList, my_arr):
c.execute("INSERT INTO %s VALUES (?, ?, ?)"%table, values)
但是,请注意您是否信任 TableNameList
的来源。在 %s
中使用不受信任的数据会导致 SQL 注入安全漏洞。
示例程序:
import sqlite3
import numpy as np
import itertools
my_arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
TableNameList = 't1', 't1', 't2', 't3'
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''CREATE TABLE t1 (c1, c2, c3)''')
c.execute('''CREATE TABLE t2 (c1, c2, c3)''')
c.execute('''CREATE TABLE t3 (c1, c2, c3)''')
## Insert a row of data
#c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
for table, values in itertools.izip(TableNameList, my_arr):
c.execute("INSERT INTO %s VALUES (?, ?, ?)"%table, values)
# Save (commit) the changes
conn.commit()
# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()