Golang Go语言中同样的一个SQL,为什么用xorm文件导入会报错,用SQL控制台导入却一切正常?
Golang Go语言中同样的一个SQL,为什么用xorm文件导入会报错,用SQL控制台导入却一切正常?
提供一些基本信息:数据库是 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 控制台使用这个文件导入一点问题都没有,真是奇怪。
更多关于Golang Go语言中同样的一个SQL,为什么用xorm文件导入会报错,用SQL控制台导入却一切正常?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我记得用 Go sql Exec 是不能换行符的,你试下组成一行
更多关于Golang Go语言中同样的一个SQL,为什么用xorm文件导入会报错,用SQL控制台导入却一切正常?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
已尝试,把原语句组成一行以后还是报错。
上下文也发下
最近的两个相关上下文如下:<br>CREATE TABLE IF NOT EXISTS `invite_code` (<br> `id` int(11) NOT NULL AUTO_INCREMENT,<br> PRIMARY KEY (`id`),<br> `code` varchar(128) NOT NULL,<br> KEY `user_id` (`user_id`),<br> `user_id` int(11) NOT NULL,<br> `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,<br> `updated_at` timestamp NOT NULL DEFAULT '2016-06-01 00:00:00'<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;<br><br>CREATE TABLE IF NOT EXISTS `announcement` (<br> `id` int(11) NOT NULL AUTO_INCREMENT,<br> PRIMARY KEY (`id`),<br> `date` datetime NOT NULL,<br> `content` LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,<br> `markdown` LONGTEXT NOT NULL<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;<br><br>CREATE TABLE IF NOT EXISTS `node` (<br> `id` int(11) NOT NULL AUTO_INCREMENT,<br> PRIMARY KEY (`id`),<br> `name` varchar(128) NOT NULL,<br> `type` int(3) NOT NULL,<br> `online_user` int(11) NOT NULL,<br> `mu_only` INT NULL DEFAULT '0',<br> `online` BOOLEAN NOT NULL DEFAULT TRUE,<br> `server` varchar(128) NOT NULL,<br> `method` varchar(64) NOT NULL,<br> `info` varchar(128) NOT NULL,<br> `status` varchar(128) NOT NULL,<br> `node_group` INT NOT NULL DEFAULT '0',<br> `sort` int(3) NOT NULL,<br> `custom_method` tinyint(1) NOT NULL DEFAULT '0',<br> `traffic_rate` float NOT NULL DEFAULT '1',<br> `node_class` int(11) NOT NULL DEFAULT '0',<br> `node_speedlimit` DECIMAL(12,2) NOT NULL DEFAULT '0.00',<br> `node_connector` int(11) NOT NULL DEFAULT '0',<br> `node_bandwidth` bigint(20) NOT NULL DEFAULT '0',<br> `node_bandwidth_limit` bigint(20) NOT NULL DEFAULT '0',<br> `bandwidthlimit_resetday` int(11) NOT NULL DEFAULT '0',<br> `node_heartbeat` bigint(20) NOT NULL DEFAULT '0',<br> `node_ip` text<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;<br><br>
使用 engine.Import(r io.Reader)或者 engine.ImportFile(fpath string)导入多条.
将原出问题的 SQL 单独抽出来进行导入,测试通过。使用 engine.Import 导入,测试通过。可能是 engine.ImportFile 不支持长 SQL 文件的原因。已经在 Gitea 上开 issue 。
在Go语言中,使用xorm库执行SQL语句时遇到错误,而同样的SQL在SQL控制台执行正常,通常可能是由以下几个原因导致的:
-
SQL语法适配问题:xorm可能会根据配置和底层数据库驱动对SQL语句进行一定的处理或适配,确保SQL语法符合xorm的解析要求。检查SQL语句是否包含xorm不支持的特殊语法或函数。
-
参数绑定问题:在xorm中执行带参数的SQL时,参数的绑定方式必须正确。如果参数类型不匹配或绑定方式错误,会导致执行失败。确保使用xorm提供的参数绑定方法,并检查参数类型是否一致。
-
事务和连接管理:xorm对数据库连接和事务的管理可能与SQL控制台不同。检查是否在使用xorm时正确管理了事务和连接,例如是否忘记提交事务或连接已关闭。
-
编码和字符集问题:如果SQL语句中包含特殊字符或编码不一致,可能导致xorm解析和执行时出错。确保SQL语句的编码与数据库字符集一致。
-
权限和配置问题:检查执行SQL的用户权限是否足够,以及xorm的配置是否正确,如数据库地址、用户名、密码等。
建议从以上几个方面进行排查,逐一确认问题所在。同时,可以开启xorm的调试模式,查看详细的执行日志和错误信息,以便更准确地定位问题。