Python MySQL加载数据填充帮助

Python MySQL加载数据填充帮助,python,mysql,load,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,715

我想加载如下所示的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
行数仅为20949行,但MySQL报告受影响的行数为41898行。为什么会这样?而且,表中没有什么真正的变化。我也看不出生成的警告是关于什么的。我想使用LOAD DATA INFILE,因为python需要半秒的时间来更新每一行,对于一个有20000多条记录的文件,这将转换为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()
#告诉MySQLdb关闭自动提交
数据库自动提交(错误)
#将计数设置为1
计数=1
计数
这里基本上有三个问题。倒序

  • 您是否在单个语句中插入Python?您可能希望用begin transaction/commit来包围它们。20000次提交很容易就需要几个小时
  • 导入语句定义了6个字段,但CSV有7个字段。这就解释了双行计数:数据库中的每一行输入结果都有两行,第二行的字段为2-6 null
  • 不完整的行将以空值或缺失列的默认值插入。对于那些格式错误的行,这可能不是您想要的

  • 如果您的python程序即使使用一个事务也不能足够快地执行,那么您至少应该让python程序在导入之前编辑/清理数据文件。如果账户编号是主键(这似乎是合理的),插入空白行可能会导致整个导入失败,或者如果启用“自动编号”,则会导致导入虚假数据。

    如果在加载数据中使用REPLACE关键字,“Deleted:”后的数字显示实际替换的行数。

    1。是的,我在单个语句中进行Python插入,因为表是MyISAM,不支持事务。2.谢谢你指出这一点。我忽略了这一点。我想我必须进一步解释我想要的最终结果。我想通过首先匹配帐号,然后更新该帐号的值来更新数据库。这将定期进行。但是,从外观上看,LOAD DATA Inflie适用于初始导入,而不适用于定期更新。将MyISAM表转换为InnoDB(忘记了InnoDB已被跳过/未加载到本地开发机器上)。