python sqlite3 executemany使用多个列表

时间:2015-10-08 18:19:22

标签: python sql numpy sqlite executemany

背景
所以我有一个大型数组,我从一个源读取并尝试使用python(高效)写入SQLite3。

目前我使用的是默认格式:

cursor.executemany("INSERT into mytable1 VALUES(?,?,?)", my_arr.tolist())

现在我想扩展到几十万张桌子。我希望能够做到以下(愿望):

cursor.executemany("INSERT into ? VALUES(?,?,?)", TableNameList, my_arr.tolist())

问题:

  • 有没有办法在不将列插入数组的情况下执行此操作 在将其转换为列表之前?什么?
  • 如果没有这种方式,那么建议和替代方案就是 请求。

我试着查看stackexchange,但可能错过了一些东西 我尝试查看Python SQLite文档,但没有看到类似的东西。 我尝试过通用谷歌搜索。

1 个答案:

答案 0 :(得分:0)

首先是Python位。假设my_arr是某种二维数组,并且.tolist()生成列表列表,是的,有一种方法可以将元素添加到列表中的每一行:

result = [[a]+b for a,b in zip(TableNameList, my_arr.tolist()]

第二,SQL位。不,您不能使用?指定表名。表名必须字面上存在于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()