Python数据库MySQLdb文件加载截断行,从另一个MySQL客户端加载文件时正常工作

2024-05-14 03:45:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用pythonmysqldb模块进行csv导入时,我会丢失数据。最疯狂的是,我可以用其他MySQL客户机加载完全相同的csv,而且效果很好。在

  • 当从sequel pro mysql客户端使用完全相同的csv运行完全相同的命令时,它工作得非常好
  • 当从mysql命令行使用完全相同的csv运行完全相同的命令时,它工作得非常好
  • 当使用mysqldb模块通过python脚本加载时,它不起作用(一些行被截断)。在

它从我的7019行csv中截取了大约10行。在

我要呼叫的命令是: LOAD DATA LOCAL INFILE '/path/to/load.txt' REPLACE INTO TABLE tble_name FIELDS TERMINATED BY ","

当使用linux上的原生mysql客户机或mac上的sequel pro mysql客户机运行上述命令时,它可以正常工作,我得到7019行导入。在

当使用Python的MySQLdb模块运行上述命令时,例如:

dest_cursor.execute( '''LOAD DATA LOCAL INFILE '/path/to/load.txt' REPLACE INTO TABLE tble_name FIELDS TERMINATED BY ","''' )
dest_db.commit()

大多数行都是导入的,但我被抛出了大量 Warning: (1265L, "Data truncated for column '<various_column_names' at row <various_rows>")

当警告弹出时,它声明at row <row_num>,但我看不到与csv中的行相关的内容(我认为是它试图在目标表上创建的行,而不是csv中的行),所以我不能用它来帮助解决问题。在

果然,完成后,我的目标表缺少一些行。在

不幸的是,csv中有7000多行,很难准确地判断出哪一行被阻塞,无法进行进一步的分析。当我无法在目标行中看到csv{3}的时候,我认为它不能帮助我在该行中创建csv}(但我认为它无法在该行中创建csv)。在

有许多行是空的和/或空的,但它们导入良好。在

事实上,我可以使用其他MySQL客户机导入整个csv,这让我觉得MySQLdb模块的配置不正确。在

这是python2.7 感谢任何帮助。任何关于如何更好地了解它被阻塞的线路的想法都会很有帮助。在


Tags: 模块csvpath命令目标data客户机local
2条回答

这是一个令人尴尬的问题,但也许我可以帮助将来犯下像我这样可怕错误的人。在

我花了很多时间分析字段、检查特殊字符等等,结果发现我只是自己造成了问题。在

  1. 我在csv中有空格,在load语句中没有使用强制的ENCLOSED BY。这意味着我在某些字段中添加了空格字符,从而导致溢出。所以数据看起来像value1, value2, value3,而它应该是value1,value2,value3。删除这些空格,在字段周围加引号,并在我的语句中强制ENCLOSED BY来解决这个问题。 我假设正在工作的客户机正在后台清理数据或其他东西。我真的不知道为什么它在其他地方使用相同的csv,但这让我通过了第一组障碍。

  2. 在完成了这些之后,csv中的最后一行被阻塞了,它声明Row doesn't contain data for all columns-结果是我在创建文件之后在尝试加载它之前没有close()。所以文件上有某种锁。一旦我添加了close()语句并修复了间距问题,所有数据现在都在加载。

很抱歉有人花了很多时间为我调查这个问题。在

为了进一步的帮助,我想问你以下问题。在

错误检查

  • 使用三种方法中的任何一种导入后,每次运行后运行此方法是否有任何结果?SELECT @@GLOBAL.SQL_WARNINGS;(如果是这样的话,应该会显示错误,因为它可能会自动失败。)
  • 你的SQL模式是什么?SELECT @@GLOBAL.SQL_MODE;
  • 检查这个文件,确保你有一个偶数的"。在
  • 检查数据中是否有额外的",,或者bash/python/mysql的翻译中可能捕捉到的任何内容?在

数据请求

  • 你能提供第一行丢失的数据吗?在
  • 你能提供你正在使用的脚本吗?在

版本

  • 你说你在使用python 2.7
  • 什么版本的mysql客户端?SELECT @@GLOBAL.VERSION;
  • 什么版本的MySQLdb?在

国际化

  • 你是在处理国际化(英语或英语等语言)?在
  • 什么是数据库/架构排序规则?在

查询:

SELECT DISTINCT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
FROM INFORMATION_SCHEMA.SCHEMATA

WHERE (
SCHEMA_NAME <> 'sys' AND
SCHEMA_NAME <> 'mysql' AND
SCHEMA_NAME <> 'information_schema' AND
SCHEMA_NAME <> '.mysqlworkbench' AND
SCHEMA_NAME <> 'performance_schema'
);
  • 什么是表排序规则?在

查询:

^{pr2}$
  • 什么是列排序规则?在

查询:

SELECT DISTINCT CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE (
TABLE_SCHEMA <> 'sys' AND
TABLE_SCHEMA <> 'mysql' AND
TABLE_SCHEMA <> 'information_schema' AND
TABLE_SCHEMA <> '.mysqlworkbench' AND
TABLE_SCHEMA <> 'performance_schema'
);
  • 最后

检查数据库

用于连接排序规则/字符集

SHOW VARIABLES 
WHERE VARIABLE_NAME LIKE 'CHARACTER\_SET\_%' OR 
VARIABLE_NAME LIKE 'COLLATION%';

如果前两种方法都能正常工作,那么我倾向于:

其他合理的担忧

我不排除以下任何问题:

总而言之,有很多东西要看,需要更多的信息来进一步帮助。在

当你有更多的信息时,请更新你的问题,我会为我的回答做同样的事情,以帮助你解决你的错误。在

希望这有帮助,一切顺利!在

更新:

你的错误

Warning: (1265L, "Data truncated for column

让我相信是Double-Quote围绕着你的“字段终止”检查,以确保你的数据在出错字段内没有逗号。这将导致您的数据在运行命令行时发生偏移。因为gui对每个say来说都“足够聪明”来处理这个问题。但是命令行是字面的!在

相关问题 更多 >