我正在尝试将大量行插入到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?我真的不想将数据按到正确的长度(和顺序?)列表 - 有更好的方法吗?
答案 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))