【发布时间】: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