mysql使用set字段加载数据本地infile语法问题

时间:2013-09-03 19:35:53

标签: mysql csv load-data-infile truncated

我尝试使用mysql的LOAD DATA LOCAL INFILE语法将.csv文件加载到现有表中。以下是我的.csv文件(带标题)中的一条记录:

 PROD,       PLANT,PORD,  REVN,A_CPN,     A_CREV,BRDI,       DTE,     LTME
 100100128144,12T1,2070000,04,3DB18194ACAA,05_01,ALA13320004,20130807,171442

问题是我想在导入过程中完成3件额外的事情:

  1. A RECORDID INT NOT NULL AUTO_INTEGER PRIMARY_KEY字段应在每行插入时递增(此表列和结构已存在于mysql表中)

  2. DTE和LTME应该连接并转换为mysql DATETIME格式并插入到名为TRANS_OCR的现有mysql列

  3. CREATED TIMESTAMP字段应设置为行插入时的当前unix时间戳(此表列和结构已存在于mysql表中)

  4. 我尝试使用以下命令将此数据导入mysql表:

     LOAD DATA LOCAL INFILE 'myfile.csv' INTO TABLE seriallog
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
     LINES TERMINATED BY '\n'
     IGNORE 1 LINES
     (FLEX_PN, FLEX_PLANT, FLEX_ORDID, FLEX_REV, CUST_PN, CUST_REV, SERIALID)
     SET CREATED = CURRENT_TIMESTAMP;
    

    我认为我已正确设置CREATED列,但其他列正在发出mysql警告:

    Warning: Out of range value for column 'FLEX_PN' at row 1
    Warning: Row 1 was truncated; it contained more data than there were input columns
    

    有人可以帮我解释语法,LOAD DATA LOCAL INFILE模块让我感到困惑......

1 个答案:

答案 0 :(得分:0)

找出使其正常工作的正确语法:

sql = """LOAD DATA LOCAL INFILE %s INTO TABLE seriallog_dev 
         FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' 
         LINES TERMINATED BY '\\n' 
         IGNORE 1 LINES 
         (FLEX_PN, FLEX_PLANT, FLEX_ORDID, FLEX_REV, CUST_PN, CUST_REV, SERIALID, @DTE, @LTME) 
         SET RECORDID = NULL, 
             TRANS_OCR = STR_TO_DATE(CONCAT(@DTE,'',@LTME), "%%Y%%m%%d%%H%%i%%s"), 
             CREATED = CURRENT_TIMESTAMP;"""

params = (file,)
self.db.query( sql, params )

请注意 - 这是通过python的mysqldb模块完成的。

<强> CAVEAT

此解决方案的唯一问题是,由于某种原因,我的批量插入仅插入来自我的文件的前217行数据。我的总文件大小是19KB所以我无法想象它对于mysql缓冲区来说太大了......那么是什么给出了?

更多信息

另外,我只是在msyql-server CLI中直接尝试了这种语法,它适用于所有255条记录。所以,显然这是python,python mysqldb模块或mysqldb模块生成的mysql连接的一些问题......

完成

我只是想出了问题,它与load data local infile命令无关,而是我在尝试导入.csv之前用来将原始.dbf文件转换为.csv的方法。出于某种原因,mysql导入方法在.csv之前运行.dbv到.csv转换方法完成 - 导致在.csv文件中找到部分数据集并导入...抱歉浪费了每个人的时间!