Python + MySQLdb executemany

时间:2009-06-10 10:09:59

标签: python mysql executemany

我正在使用Python及其MySQLdb模块将一些测量数据导入Mysql数据库。我们拥有的数据量非常高(目前大约有250 MB的csv文件,还有更多的文件)。

目前我使用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)

然后一次读入一个列表,其中row是来自csv.DictReader的迭代器。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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]