V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
marcosteam
V2EX  ›  Go 编程语言

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

  •  
  •   marcosteam · 2021-03-19 15:37:53 +08:00 · 1341 次点击
    这是一个创建于 1105 天前的主题,其中的信息可能已经有所发展或是发生改变。

    提供一些基本信息:数据库是 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 控制台使用这个文件导入一点问题都没有,真是奇怪。

    6 条回复    2021-03-19 17:54:32 +08:00
    lxz6597863
        1
    lxz6597863  
       2021-03-19 16:17:16 +08:00
    我记得用 Go sql Exec 是不能换行符的,你试下组成一行
    marcosteam
        2
    marcosteam  
    OP
       2021-03-19 16:24:54 +08:00
    @lxz6597863 已尝试,把原语句组成一行以后还是报错。
    dongtingyue
        3
    dongtingyue  
       2021-03-19 16:30:26 +08:00
    上下文也发下
    marcosteam
        4
    marcosteam  
    OP
       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
        5
    dongtingyue  
       2021-03-19 17:14:22 +08:00
    使用 engine.Import(r io.Reader)或者 engine.ImportFile(fpath string)导入多条.
    marcosteam
        6
    marcosteam  
    OP
       2021-03-19 17:54:32 +08:00
    @dongtingyue 将原出问题的 SQL 单独抽出来进行导入,测试通过。使用 engine.Import 导入,测试通过。可能是 engine.ImportFile 不支持长 SQL 文件的原因。已经在 Gitea 上开 issue 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5410 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 06:03 · PVG 14:03 · LAX 23:03 · JFK 02:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.