Python MySQL查询未完成

时间:2010-02-18 01:04:37

标签: python mysql

我遇到Python脚本问题,基本上只是逐行分析CSV文件,然后使用FOR循环将每一行插入MySQL表:

f = csv.reader(open(filePath, "r"))
i = 1
for line in f:
    if (i > skipLines):
        vals = nullify(line)
        try:
            cursor.execute(query, vals)
        except TypeError:
            sys.exc_clear()
    i += 1
return

查询的格式为:

query = ("insert into %s" % tableName) + (" values (%s)" % placeholders)

这对于它所使用的每个文件都有效,只有一个例外 - 最大的文件。它每次都停在不同的点 - 有时达到600,000条记录,有时达到900,000条记录。但总共有大约4,000,000条记录。

我无法弄清楚为什么会这样做。表类型是MyISAM。有足够的磁盘空间。该表停止时达到约35MB。 max_allowed_packet设置为16MB,但我不认为这是一个问题,因为它是逐行执行的?

任何人都有任何想法可能是什么?不确定是负责这个的Python,MySQL还是MySQLdb模块。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您是否尝试过LOAD MySQL功能?

query = "LOAD DATA INFILE '/path/to/file' INTO TABLE atable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\'"
cursor.execute( query )

您始终可以预处理CSV文件(至少我正在做的事情:)

值得尝试的另一件事是批量插入。您可以尝试使用一个查询插入多行:

INSERT INTO x (a,b)
VALUES 
('1', 'one'),
('2', 'two'),  
('3', 'three')

哦,是的,你不需要提交,因为它是MyISAM引擎。

答案 1 :(得分:0)

正如S. Lott所暗示的,不是用作交易句柄的游标吗?

因此,db在任何时候都可以选择回滚所有挂起的插入。

您可能只是为一个事务插入了太多插件。尝试每隔几千次插入提交事务。