2015-12-28 36 views
1

当我尝试插入使用列表压缩生成的元组列表时,executemany会抛出错误,但如果插入相同的列表(如果它是硬编码),则工作正常。当我尝试:当我尝试插入由列表理解生成的元组列表时,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:错误绑定参数4 - 可能不支持的类型。

但是,当我硬编码的值列表:

b=[('1000000US371830501001017', 'White', 2, '150-200K', 184, 'Renter'),\ 
('1000000US371830501001017', 'Asian', 2, '125-150K', 250, 'Renter')] 

,并尝试:

c.executemany('INSERT INTO Households VALUES(?,?,?,?,?,?)',b) 

它工作正常。当我检查一个== b时,我变成了True。

我不明白它是如何可能的,因为a和b似乎是同一件事情。

+0

你检查过'a'和'b'确实是否一样吗?尝试打印'a'的值。 – 9000

+0

是的,我做到了。我打印的值是相同的,正如我所说的,a == b返回True。 –

回答

0

我怀疑在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中可以有什么。

我已经看到对象通过巧妙的代理属性(包括相等性)假装字符串的行为。但是,如果将这样的对象传递给C库(如sqlite或其他数据库驱动程序),则会消除错觉:发生类型错误,因为它们期望一个实际的字符串。

+0

铸造到字符串工作。但似乎问题与整数值有关,而不是字符串值。我只将第三和第五项改为字符串。虽然我的第三和第五个字段类型是整数,但下面的工作:a = [(i [0] [0],i [0] [1],str(i [0] [2]),i [1] [ 0],str(i [1] [1]),i [0] [5])为我在zipList_updates]。但这些整数对b没有任何问题。另一种解决方法是将整个列表转换为一个字符串,然后使用一些混乱的字符串方法重新创建列表和嵌套的字符串。 –

+0

很有趣。顺便说一句,你可以用'import json替换杂乱的字符串方法; a_json = json.dumps(a); recreated_a = json.loads(a_json)'。不过,我宁愿避免这两种情况,并确保我理解整数参数的情况。例如,您收到的参数可以是['decimal'](https://docs.python.org/2/library/decimal.html),它们可以打印,比较和以其他方式表现为正常数字(仅更精确),但是C库不会把它们放在需要一个整数的地方。 – 9000

相关问题