如何使用executemany将列表列表插入到SQLite中

时间:2013-12-25 13:39:25

标签: python sqlite python-3.x

我正在尝试将大量行插入到sqlite表中,因此我正在尝试使用executemany

我有这样的设置:

data_list = [['apples',10,'red'],['bananas',5,'yellow']]

dbc.executemany('
   insert into table
   (fruit, colour)
   values
   (?,?)',
   (data_list[0],data_list[2]))

正如你所看到的,我不想要data_list中的所有内容,在这种情况下,我不想要这个数字。

问题是,尽管我指定了要使用的列表中的哪些项目,但我得到了这个错误:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 3 supplied.

如何使用executemany将数据导入sqlite?我真的不想将数据按到正确的长度(和顺序?)列表 - 有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我必须诚实,我不了解数据库。另一方面,data_list只有两个元素。你不能调用data_list [2]导致data_list的第三个元素(它不存在)。如果您需要['apples',10,'red'],则应键入data_list[0],如果需要['bananas',5,'yellow'],则应键入data_list[1]。根据我的理解你不想要数字,因此我会创建两个除了数字之外具有相同内容的新列表。

data_list = filter(lambda x : x not in range(1000) , data_list[0]),
filter(lambda y : y not in range(1000)  , data_list[1])

现在data_list等于data_list = [['apples','red'],['bananas',yellow']]

答案 1 :(得分:0)

由于您只插入部分数据,因此最本能的解决方案可能是使用execute()而不是executemany()。如果你没有太多数据,这不会让你太慢。

但如果你真的想使用executemany(),你可能需要zip()并将数据压缩两次。在介质中,list()用于提供下标特征。这是我的代码:

data_list = [['apples',10,'red'],['bananas',5,'yellow']]
firstZip = list(zip(*data_list))
secondZip = zip(firstZip[0], firstZip[2])
dbc.executemany('insert into fruitTable (fruit, colour) values (?,?)', 
                secondZip)

注意executemany()采用可迭代的序列作为输入。因此,如果只需要一个变量并且使用1-D列表作为输入,那么zip()也应该用于消除ValueError:

dbc.executemany('insert into fruitTable (fruit) values (?)', zip(fruitNameList))