我在使用 Python MySQLdb 模块进行 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 上的 native 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 中有超过 7,000 行很难准确判断它在哪一行进行进一步分析。当警告弹出时,它会显示 at row <row_num>
但我没有看到它与 csv 中的行相关(我认为这是它试图在目标表上创建的行,而不是 csv 中的行)所以我不能用它来帮助排除故障。
有许多行为 null 和/或空白,但它们导入正常。
事实上,我可以使用其他 MySQL 客户端导入整个 csv,这让我觉得 MySQLdb 模块配置不正确之类的。
这是 Python 2.7 任何帮助表示赞赏。关于如何更好地了解它阻塞在哪条线上的任何想法都会有所帮助。
最佳答案
为了进一步的帮助,我会问你以下问题。
错误检查
- 在使用三种方法中的任何一种导入之后,每次运行后运行此程序是否有任何结果?
SELECT @@GLOBAL.SQL_WARNINGS;
(如果是这样,这应该会向您显示错误,因为它可能会默默地失败。) - 你的 SQL_MODE 是什么?
SELECT @@GLOBAL.SQL_MODE;
- 检查文件并确保你有偶数个
"
。 - 检查数据是否有额外的
"
或,
或任何可能在 bash/python/mysql 的翻译中被捕获的内容?
数据请求
- 您能否提供缺少的第一行的数据?
- 您能否提供您正在使用的确切脚本?
版本
- 你说你使用的是
python 2.7
- 什么版本的mysql客户端?
SELECT @@GLOBAL.VERSION;
- 什么版本的 MySQLdb?
国际化
- 您是否正在处理国际化(汉语 Hànyǔ 或 русский 等语言)?
- 什么是数据库/模式整理?
查询:
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'
);
- 什么是表排序规则?
查询:
SELECT DISTINCT ENGINE, TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES
WHERE (
TABLE_SCHEMA <> 'sys' AND
TABLE_SCHEMA <> 'mysql' AND
TABLE_SCHEMA <> 'information_schema' AND
TABLE_SCHEMA <> '.mysqlworkbench' AND
TABLE_SCHEMA <> 'performance_schema'
);
- 什么是列排序规则?
查询:
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'
);
- 最后
检查数据库
用于连接排序规则/character_set
SHOW VARIABLES
WHERE VARIABLE_NAME LIKE 'CHARACTER\_SET\_%' OR
VARIABLE_NAME LIKE 'COLLATION%';
如果前两种方法没有错误,那么我倾向于:
其他可能的问题
我不排除以下任何问题:
可能存在 python 连接配置问题
- python 到数据库连接整理
- 默认连接超时
- 默认字符集错误
python/bash 运行时符号插值导致随机隐藏 gem
数据库排序规则未设置为处理外语
超过 MAX(字段值)
我上面用双引号、逗号提到的数据问题,我忘了提到 NewLines for
Windows
orLinux
(Carriage return or NewLine)
总而言之,有很多内容需要查看,需要更多信息才能提供进一步帮助。
当您有更多信息时,请更新您的问题,我也会对我的回答做同样的事情,以帮助您解决错误。
希望这对您有所帮助,一切顺利!
更新:
你的错误
Warning: (1265L, "Data truncated for column
让我相信这是围绕您的“字段终止”的 双引号
检查以确保您的数据在错误字段内没有逗号。这将导致您的数据在运行命令行时发生变化。因为 gui 是“足够聪明的”来处理这个问题。但命令行是字面意思!
关于Python MySQLdb 文件加载截断行,从另一个 mysql 客户端加载文件时工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323278/