2009-06-10 105 views
5

我使用Python及其MySQLdb模块将一些测量数据导入Mysql数据库。我们拥有的数据量相当高(目前约为250 MB的csv文件,还有更多内容)。Python + MySQLdb executemany

目前我使用cursor.execute(...)导入一些元数据。这不是问题,因为这些只有少数条目。

的问题是,当我尝试使用cursor.executemany()进口数量较多的实际测量数据,MySQLdb的提出了一个

TypeError: not all arguments converted during string formatting 

我当前的代码是

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into values (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 

哪里values是每个包含三个字符串的元组列表。任何想法可能是这个错误?

编辑:

值由

yield (prefix + row['id'], row['value'], sample_id) 

生成,然后读入一个列表千出现的同时,行和迭代器csv.DictReader到来。

+1

您是否验证了值包含正确的数据? 另外,你应该看看使用LOAD LOCAL DATA INFILE。它可以快得多。 – 2009-06-10 10:36:38

+0

问题是数据需要进行预处理(目前在同一个python脚本中完成),并且创建此类大型数据集的冗余副本不太可行。 这些值应该没问题,因为我使用调试器检查了这些值。 – lhahne 2009-06-10 10:44:14

回答

7

回顾展这是一个非常愚蠢的埠很难发现错误。值是sql中的关键字,因此表名值需要引号。

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into `values` (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 
3

您收到的消息表示在executemany()方法中,其中一个转换失败。检查values列表比3

不再是一个元组快速验证:

max(map(len, values)) 

如果结果高于3,找到你的坏元组过滤器:

[t for t in values if len(t) != 3] 

或者,如果你需要的索引:

[(i,t) for i,t in enumerate(values) if len(t) != 3]