帮助与MySQL LOAD DATA INFILE

问题描述:

我想加载一个CSV文件看起来像这样:帮助与MySQL LOAD DATA INFILE

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半秒来更新每行,对于具有20,000个以上记录的文件,其转换为2.77小时。

UPDATE:修改代码来设置自动提交到 '假',并增加了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-6空。
  3. 不完整的行将插入缺失列的空值或缺省值。这可能不是您想要的格式不正确的行。

如果你的python程序即使只有一个事务处理速度不够快,你至少应该让python程序在导入前编辑/清除数据文件。如果Acct。编号是主键,因为看起来合理,插入带空白的行将导致整个导入失败,或者如果自动编号打开,会导致伪造数据被导入。

+0

是的,我做的Python在插入单个语句,因为该表是MyISAM和没有按不支持交易。 2.谢谢你指出这一点。我忽略了这个。 我想我必须进一步解释我想要的最终结果。我想通过首先匹配帐号并更新该帐号的值来更新数据库。这将会定期完成。但是,从它的外观来看,LOAD DATA INFILE适用于初始导入,不适合定期更新。 – Francis 2009-08-06 05:03:18

+0

将MyISAM表转换为InnoDB(忘记InnoDB在本地开发机器上被跳过/未加载)。 – Francis 2009-08-06 07:02:30

如果你使用LOAD DATA,REPLACE关键字再经过数“已删除”显示有多少行实际上取代