同样的一个 SQL ,为什么用 xorm 文件导入会报错,用 SQL 控制台导入却一切正常?

2021-03-19 15:37:53 +08:00
 marcosteam

提供一些基本信息:数据库是 Percona Server,该 SQL 文件一共 279 行,使用 xorm 导入时大约会在 113 行出错,报错部分的提示为:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TABLE IF NOT EXISTS `announcement` ( `id` int(11) NOT NULL AUTO_INCREME' at line 13

这段附近的 SQL 源代码如下:

CREATE TABLE IF NOT EXISTS `announcement` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`),
 `date` datetime NOT NULL,
 `content` LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
 `markdown` LONGTEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

但是在 SQL 控制台使用这个文件导入一点问题都没有,真是奇怪。

1378 次点击
所在节点    Go 编程语言
6 条回复
lxz6597863
2021-03-19 16:17:16 +08:00
我记得用 Go sql Exec 是不能换行符的,你试下组成一行
marcosteam
2021-03-19 16:24:54 +08:00
@lxz6597863 已尝试,把原语句组成一行以后还是报错。
dongtingyue
2021-03-19 16:30:26 +08:00
上下文也发下
marcosteam
2021-03-19 16:39:33 +08:00
@dongtingyue 最近的两个相关上下文如下:

```
CREATE TABLE IF NOT EXISTS `invite_code` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
`code` varchar(128) NOT NULL,
KEY `user_id` (`user_id`),
`user_id` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT '2016-06-01 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `announcement` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
`date` datetime NOT NULL,
`content` LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`markdown` LONGTEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `node` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
`name` varchar(128) NOT NULL,
`type` int(3) NOT NULL,
`online_user` int(11) NOT NULL,
`mu_only` INT NULL DEFAULT '0',
`online` BOOLEAN NOT NULL DEFAULT TRUE,
`server` varchar(128) NOT NULL,
`method` varchar(64) NOT NULL,
`info` varchar(128) NOT NULL,
`status` varchar(128) NOT NULL,
`node_group` INT NOT NULL DEFAULT '0',
`sort` int(3) NOT NULL,
`custom_method` tinyint(1) NOT NULL DEFAULT '0',
`traffic_rate` float NOT NULL DEFAULT '1',
`node_class` int(11) NOT NULL DEFAULT '0',
`node_speedlimit` DECIMAL(12,2) NOT NULL DEFAULT '0.00',
`node_connector` int(11) NOT NULL DEFAULT '0',
`node_bandwidth` bigint(20) NOT NULL DEFAULT '0',
`node_bandwidth_limit` bigint(20) NOT NULL DEFAULT '0',
`bandwidthlimit_resetday` int(11) NOT NULL DEFAULT '0',
`node_heartbeat` bigint(20) NOT NULL DEFAULT '0',
`node_ip` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

```
dongtingyue
2021-03-19 17:14:22 +08:00
使用 engine.Import(r io.Reader)或者 engine.ImportFile(fpath string)导入多条.
marcosteam
2021-03-19 17:54:32 +08:00
@dongtingyue 将原出问题的 SQL 单独抽出来进行导入,测试通过。使用 engine.Import 导入,测试通过。可能是 engine.ImportFile 不支持长 SQL 文件的原因。已经在 Gitea 上开 issue 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/763219

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX