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

标签 python mysql mysql-python

我在使用 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%';

如果前两种方法没有错误,那么我倾向于:

其他可能的问题

我不排除以下任何问题:

总而言之,有很多内容需要查看,需要更多信息才能提供进一步帮助。

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

希望这对您有所帮助,一切顺利!

更新:

你的错误

Warning: (1265L, "Data truncated for column

让我相信这是围绕您的“字段终止”的 双引号 检查以确保您的数据在错误字段内没有逗号。这将导致您的数据在运行命令行时发生变化。因为 gui 是“足够聪明的”来处理这个问题。但命令行是字面意思!

关于Python MySQLdb 文件加载截断行,从另一个 mysql 客户端加载文件时工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323278/

相关文章:

python - 用于多类对象检测的分层 K 折?

python - Google 应用程序引擎 os.path 功能不起作用

python - Django 单元测试返回退出代码 = 0 表示通过和失败

php - 如何在 php 中将 2 个参数传递给 array_map 函数?

mysql - 无法从我的 App Engine 访问 Google Cloud SQL 数据库

python - Django + OsX Lion + 带有 XAMPP 的 Mysql

python - 创建索引时死锁

php - 如何设置状态

python - 使用 MySQLdb 从 Python 中获取 MySQL

python - MySQL 5.6 中的全局查询超时