我正在使用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
的迭代器。
答案 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]