mySQL 加载数据 - 第 1 行不包含所有列的数据
mySQL Load Data - Row 1 doesn't contain data for all columns
我看过很多关于这个主题的类似问题。但是 none 似乎适用。
详情如下:
我有一个有 8 列的 table。
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
);
table上有触发器:
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()
我有一个要加载到此 table 中的 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)
所以..我基本上加载文件的前两列..我设置加载语句中的下两列,最后 4 个由 触发器 .
处理
我再说一遍 - 这在 mysql 5 环境中运行良好,但在 mysql 8.
中运行良好
我检查了两个数据库环境中的 mysql 字符集变量,它们是等价的(以防 5.6 和 8 之间的默认字符集变化产生影响)。
我会说 mySQL 5 db 运行ning 在 ubuntu 18.04.5 而 mySQL 8 运行ning 在 ubuntu 20.02.2 - 那里会不会有东西?
我已经尝试过对 LOAD DATA 语句进行各种调整。我尝试为文件中的前两条记录填充数据,以防万一。我尝试在 LOAD 语句中使用不同的行终止符。 .我不知道接下来要调查什么..
谢谢指点..
MySQL 将假定您的 CSV 中的每一行都映射到 table 中的一列,除非您另有说明。
为查询提供一个列列表:
LOAD DATA INFILE 'test.csv'
INTO TABLE test
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
IGNORE 1 LINES
(node_name, parent)
SET fid = 526, actv = 1;
除了Tangentially Perpendicular的答案,还有其他选项:
按照以下方式添加 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”之前
或者,将 sql_mode 改得不那么严格也可以。
由于严格的 sql_mode,LOAD DATA 不够智能,无法意识到 TRIGGERS 正在处理几列。如果他们将其增强为那么智能就好了。但是唉。
我看过很多关于这个主题的类似问题。但是 none 似乎适用。 详情如下:
我有一个有 8 列的 table。
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
);
table上有触发器:
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()
我有一个要加载到此 table 中的 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)
所以..我基本上加载文件的前两列..我设置加载语句中的下两列,最后 4 个由 触发器 .
处理我再说一遍 - 这在 mysql 5 环境中运行良好,但在 mysql 8.
中运行良好我检查了两个数据库环境中的 mysql 字符集变量,它们是等价的(以防 5.6 和 8 之间的默认字符集变化产生影响)。
我会说 mySQL 5 db 运行ning 在 ubuntu 18.04.5 而 mySQL 8 运行ning 在 ubuntu 20.02.2 - 那里会不会有东西?
我已经尝试过对 LOAD DATA 语句进行各种调整。我尝试为文件中的前两条记录填充数据,以防万一。我尝试在 LOAD 语句中使用不同的行终止符。 .我不知道接下来要调查什么.. 谢谢指点..
MySQL 将假定您的 CSV 中的每一行都映射到 table 中的一列,除非您另有说明。
为查询提供一个列列表:
LOAD DATA INFILE 'test.csv'
INTO TABLE test
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
IGNORE 1 LINES
(node_name, parent)
SET fid = 526, actv = 1;
除了Tangentially Perpendicular的答案,还有其他选项:
按照以下方式添加 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”之前或者,将 sql_mode 改得不那么严格也可以。
由于严格的 sql_mode,LOAD DATA 不够智能,无法意识到 TRIGGERS 正在处理几列。如果他们将其增强为那么智能就好了。但是唉。