当我尝试插入由列表推导生成的元组列表时,执行许多抛出错误;如果相同的列表是硬编码的,则相同列表有效



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库或其他数据库驱动程序,这种错觉就会消除:类型错误会发生,因为它们需要一个真实的字符串。

最新更新