当我尝试插入由列表理解生成的元组列表时,executemany 抛出错误;如果它是硬编码的,则相同的列表有效
Posted
技术标签:
【中文标题】当我尝试插入由列表理解生成的元组列表时,executemany 抛出错误;如果它是硬编码的,则相同的列表有效【英文标题】:executemany throws error when I try inserting a list of tuples generated by list comprehension; same list works if it's hard-coded 【发布时间】:2016-04-02 15:16:40 【问题描述】:当我尝试插入使用列表压缩生成的元组列表时,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)
我得到:InterfaceError: Error binding parameter 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 似乎是同一件事。
【问题讨论】:
您检查a
和b
是否确实相同?尝试打印a
的值。
是的,我做到了。我打印了它们相同的值,正如我所说的 a==b 返回 True。
【参考方案1】:
我怀疑将项目包装在 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 库或其他数据库驱动程序,这种错觉就会消除:会发生类型错误,因为它们需要一个真正的字符串。
【讨论】:
转换为字符串有效。但似乎问题与整数值有关,而不是字符串值。我只将第 3 项和第 5 项更改为字符串。虽然我的第 3 和第 5 字段类型是整数,但以下有效: a=[(i[0][0],i[0][1],str(i[0][2]),i[1][ 0],str(i[1][1]),i[0][5]) for i in zipList_updates] 。不过,这些整数不会对 b 造成任何问题。另一个可行的解决方案是将整个列表转换为字符串,然后使用一些混乱的字符串方法重新创建列表并从字符串中嵌套元组。 很有趣。顺便说一句,您可能可以用import json; a_json = json.dumps(a); recreated_a = json.loads(a_json)
替换凌乱的字符串方法。不过,我宁愿避免两者,并确保我了解整数参数的情况。例如,您收到的参数可以是 decimal
,它们会打印、比较或以其他方式表现得像普通数字(只是更精确),但 C 库不会将它们带到它需要整数的地方。以上是关于当我尝试插入由列表理解生成的元组列表时,executemany 抛出错误;如果它是硬编码的,则相同的列表有效的主要内容,如果未能解决你的问题,请参考以下文章