【问题标题】:mySQL Load Data - Row 1 doesn't contain data for all columnsmySQL 加载数据 - 第 1 行不包含所有列的数据
【发布时间】:2021-05-17 03:12:59
【问题描述】:

我看过很多关于这个主题的类似问题。但似乎没有一个适用。 以下是详细信息:

我有一个 8 列的表格。

create table test (
node_name varchar(200),
parent  varchar(200),
actv int(11),
fid int(11),
cb varchar(100),
co datetime,
ub varchar(100),
uo datetime
);

桌子上有一个触发器:

CREATE TRIGGER before_insert_test
BEFORE INSERT ON test
FOR EACH ROW SET NEW.co = now(), NEW.uo = now(), NEW.cb = user(), NEW.ub = user()

我有一个 csv 文件要加载到此表中。它只有 2 列。 前几行:

node_name,parent
West,
East,
BBB: someone,West
Quebec,East
Ontario,East
Manitoba,West
British Columbia,West
Atlantic,East
Alberta,West

我在 mySQL 5.6 环境中设置了这一切。使用 python 和 SQLAlchemy,我运行文件的加载没有问题。它为前 2 个记录中的第二个字段加载空字符串的所有记录。一切如预期。

我有一个 mysql 8 环境,并运行完全相同的例程。所有相同的语句等。它失败并出现“第 1 行不包含所有列的数据”错误。

使用以下方式建立连接:

engine = create_engine(
connection_string,
pool_size=6, max_overflow=10, encoding='latin1', isolation_level='AUTOCOMMIT',
connect_args={"local_infile": 1}
)
db_connection = engine.connect()

我放在sql变量中的命令是:

LOAD DATA INFILE 'test.csv' 
INTO TABLE test 
FIELDS TERMINATED BY ','  ENCLOSED BY '\"' IGNORE 1 LINES SET fid = 526, actv = 1;

然后执行它:

    db_connection.execute(sql)

所以..我基本上加载文件中的前两列..我在加载语句中设置接下来的 2 列,并处理最后 4 列通过触发器

我再说一遍 - 这在 mysql 5 环境中运行良好,但在 mysql 8 环境中不行。

我在两个 db 环境中检查了 mysql 字符集变量,它们是等效的(以防 5.6 和 8 之间的默认字符集更改产生影响)。

我会说 mySQL 5 db 在 ubuntu 18.04.5 上运行,而 mySQL 8 在 ubuntu 20.02.2 上运行 - 那里有什么东西吗??

我已经尝试过对 LOAD DATA 语句进行各种摆弄。我尝试为文件中的前两条记录填充数据以防万一。我尝试在 LOAD 语句中使用不同的行终止符。我我对接下来要调查的事情感到茫然。 感谢您的任何指点..

【问题讨论】:

    标签: python mysql ubuntu sqlalchemy


    【解决方案1】:

    MySQL 将假定 CSV 中的每一行都映射到表中的一列,除非你另有说明。

    给查询一个列列表:

    LOAD DATA INFILE 'test.csv' 
    INTO TABLE test 
    FIELDS TERMINATED BY ','  
    ENCLOSED BY '\"' 
    IGNORE 1 LINES 
    (node_name, parent)
    SET fid = 526, actv = 1;
    

    【讨论】:

    • 我明天试一试.. 但它在 v5 和 v8 之间发生了变化吗?
    • 据我所知,LOAD DATA INFILE 的操作被sql_mode 系统变量的设置所修改。这可能在不同的 MySQL 安装之间有所不同。有关所有血腥细节,请参阅dev.mysql.com/doc/refman/8.0/en/…
    • 啊.. 可能是这样.. 我知道 sql_mode 默认值肯定是不同的.. 我会找出具体是哪一个导致这个..
    • 是的,在阅读完文档后,我添加了 IGNORE 关键字以使用非限制模式......它只是给出警告但会加载数据。它在某处似乎仍然是一个错误,因为最后每一列都有数据(根据触发器)..但它给我插入的每一行都发出警告,抱怨没有所有列的数据。也许我会记录下来让他们调查
    • 顺便说一句..我试图避免列列表,因为这些东西都是动态生成的,我懒惰的一面不想弄清楚列..所以我可能只是忽略(希望我不会错过真正的错误)
    【解决方案2】:

    除了Tangentially Perpendicular的回答,还有其他选择:

    1. 按以下方式添加 IGNORE 关键字: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#ignore-effect-on-execution 根据https://dev.mysql.com/doc/refman/8.0/en/load-data.html,它应该位于 LOAD DATA 语句中的“INTO”之前。

    2. 或者,将 sql_mode 更改为不那么严格也可以。

    由于严格的 sql_mode,LOAD DATA 不够聪明,无法意识到 TRIGGERS 正在处理几列。如果他们将其增强为那么聪明会很好。但是唉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多