Python + MySQLdb 执行许多
Posted
技术标签:
【中文标题】Python + MySQLdb 执行许多【英文标题】:Python + MySQLdb executemany 【发布时间】:2010-11-01 18:16:28 【问题描述】:我正在使用 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)
然后一次读入一千个列表,其中行和迭代器来自csv.DictReader
。
【问题讨论】:
您是否验证过 values 包含正确的数据?顺便说一句,您应该考虑使用 LOAD LOCAL DATA INFILE。它可以更快。 问题是需要对数据进行预处理(目前在同一个 python 脚本中完成),创建如此大数据集的冗余副本不是很可行。这些值应该没问题,因为我用调试器检查过。 【参考方案1】:您收到的消息表明在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]
【讨论】:
谢谢,但这不是问题。所有元组的长度都正确。【参考方案2】:回想起来,这是一个非常愚蠢但很难发现的错误。 values 是 sql 中的一个关键字,所以表名 values 需要用引号引起来。
def __insert_values(self, values):
cursor = self.connection.cursor()
cursor.executemany("""
insert into `values` (ensg, value, sampleid)
values (%s, %s, %s)""", values)
cursor.close()
【讨论】:
以上是关于Python + MySQLdb 执行许多的主要内容,如果未能解决你的问题,请参考以下文章
python MySQLdb Windows下安装教程及问题解决方法
Python MySQLdb模块:不调用字符串格式可以插入或更新吗?
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQ