executemany在尝试插入使用列表压缩生成的元组列表时抛出错误,但如果是硬代码,则在插入相同列表时有效。当我尝试时:
a=[(i[0][0],i[0][1],i[0][2],i[1][0],i[1][1],i[0][5]) for i in zipList_updates]
c.executemany('INSERT INTO Households VALUES(?,?,?,?,?,?)',a)
我得到:接口错误:绑定参数4时出错-可能是不受支持的类型。
但当我将值列表硬编码为:时
b=[('1000000US371830501001017', 'White', 2, '150-200K', 184, 'Renter'),
('1000000US371830501001017', 'Asian', 2, '125-150K', 250, 'Renter')]
并尝试:
c.executemany('INSERT INTO Households VALUES(?,?,?,?,?,?)',b)
它运行良好。当我检查a==b时,我得到True。
我不明白为什么a和b看起来是一回事。
我怀疑用str()
包装物品可能有帮助:
# factor out a bit of copy-paste
def makeTuple(record):
indexes = ((0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (0, 5))
# note the str↴
return tuple(str(record[j][k]) for (j, k) in indexes)
a = [makeTuple(i) for i in zipList_updates]
尝试检查a
元组中项的类型。在b
项内的元组中肯定是字符串。我不知道zipLiat_updates
中有什么。
我已经看到对象通过巧妙地代理属性(包括相等)来假装字符串的行为。但是,如果将这样一个对象传递给像sqlite
这样的C库或其他数据库驱动程序,这种错觉就会消除:类型错误会发生,因为它们需要一个真实的字符串。