python - 帮助 MySQL LOAD DATA INFILE

标签 python mysql load load-data-infile

我想加载一个如下所示的 CSV 文件:

Acct. No.,1-15 Days,16-30 Days,31-60 Days,61-90 Days,91-120 Days,Beyond 120 Days
2314134101,898.89,8372.16,5584.23,7744.41,9846.54,2896.25
2414134128,5457.61,7488.26,9594.02,6234.78,273.7,2356.13
2513918869,2059.59,7578.59,9395.51,7159.15,5827.48,3041.62
1687950783,4846.85,8364.22,9892.55,7213.45,8815.33,7603.4
2764856043,5250.11,9946.49,8042.03,6058.64,9194.78,8296.2
2865446086,596.22,7670.04,8564.08,3263.85,9662.46,7027.22
,4725.99,1336.24,9356.03,1572.81,4942.11,6088.94
,8248.47,956.81,8713.06,2589.14,5316.68,1543.67
,538.22,1473.91,3292.09,6843.89,2687.07,9808.05
,9885.85,2730.72,6876,8024.47,1196.87,1655.29

但是如果您注意到,有些字段是不完整的。我在想 MySQL 只会跳过第一列缺失的行。当我运行命令时:

LOAD DATA LOCAL INFILE 'test-long.csv' REPLACE INTO TABLE accounts
    FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (cf_535, cf_580, cf_568, cf_569, cf_571, cf_572);

MySQL 的输出是:

Query OK, 41898 rows affected, 20948 warnings (0.78 sec)
Records: 20949  Deleted: 20949  Skipped: 0  Warnings: 20948

行数只有 20,949,但 MySQL 报告有 41,898 行受到影响。为什么这样?此外,表中没有真正改变。我也看不到生成的警告是什么。我想使用 LOAD DATA INFILE,因为它需要 python 半秒来更新每一行,这对于一个包含 20,000 多条记录的文件来说需要 2.77 小时。

更新:修改了代码以将自动提交设置为“False”并添加了 db.commit() 语句:

# Tell MySQLdb to turn off auto-commit
db.autocommit(False) 

# Set count to 1
count = 1
while count < len(contents):
    if contents[count][0] != '':
        cursor.execute("""
            UPDATE accounts SET cf_580 = %s, cf_568 = %s, cf_569 = %s, cf_571 = %s, cf_572 = %s
            WHERE cf_535 = %s""" % (contents[count][1], contents[count][2], contents[count][3], contents[count][4], contents[count][5], contents[count][0]))
    count += 1

try:
    db.commit()
except:
    db.rollback()

最佳答案

这里基本上有 3 个问题。倒序

  1. 您是否在单独的语句中执行 Python 插入操作?您可能想用开始事务/提交将它们全部包围起来。 20,000 次提交很容易花费数小时。
  2. 您的导入语句定义了 6 个字段,但 CSV 文件有 7 个字段。这可以解释双行计数:每行输入在数据库中产生 2 行,第 2 行的字段 2-6 为空。
  3. 将插入不完整的行,并为缺失的列插入空值或默认值。对于那些格式错误的行,这可能不是您想要的。

如果您的 python 程序即使处理单个事务也不能足够快地执行,您至少应该让 python 程序在导入之前编辑/清理数据文件。如果帐户。序号是主键,貌似合理,插入空白行要么导致整个导入失败,要么开启自动编号,导致导入伪数据。

关于python - 帮助 MySQL LOAD DATA INFILE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1236971/

相关文章:

python - Python + OpenCV名称未定义

javascript - Appfog与node.js如何使用javascript访问mysql数据库?

PHP - 从数据库加载/删除是否使用静态方法?

jQuery load() a href 链接加载到 div 中,不与我的函数交互,但该函数在初始页面上工作

python - python中的多面体边缘

python - 仅使用 panda 替换数据框中的值(不使用 numpy)

python - 如何覆盖 Django Rest Framework Serializer 中的验证?

Mysql函数从过程调用返回行数

MySQL 累计计数未清项

file - Delphi:使用SynEdit加载大文件