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

Python&MySQL

Python MySQLdb执行缓慢

Python MySQLdb 面向对象