使用Go Gorm执行多语句Raw SQL报错,PhpMyAdmin可正常运行
问题原因与解决方案
你遇到的错误是因为Gorm依赖的MySQL驱动默认禁用了多语句执行功能。虽然你的SQL语句在PhpMyAdmin中能正常运行,但Go的mysql驱动为了防范SQL注入风险,默认不允许在单次Exec调用中执行多条用分号分隔的SQL语句。
解决方案一:拆分SQL语句分别执行(推荐)
最安全的做法是把建表和插入数据的操作拆成两次Exec调用,各自执行单条SQL:
package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) const CREATE_TABLE_SQL = "CREATE TABLE `mytable` (`a` int);" const INSERT_DATA_SQL = "INSERT INTO `mytable` (`a`) VALUES (1);" func main() { dsn := "sandbox:sandbox@tcp(localhost)/sandbox?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn)) if err != nil { panic(err) } // 先执行建表 err = db.Exec(CREATE_TABLE_SQL).Error if err != nil { panic(err) } // 再执行插入 err = db.Exec(INSERT_DATA_SQL).Error if err != nil { panic(err) } }
解决方案二:开启多语句支持(谨慎使用)
如果必须在单次调用中执行多条SQL,可在DSN连接字符串中添加multiStatements=true参数,强制开启多语句执行功能。注意:此方式存在SQL注入风险,仅当你完全信任要执行的SQL内容时使用:
dsn := "sandbox:sandbox@tcp(localhost)/sandbox?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"
添加该参数后,原代码中的单条Exec调用就能正常执行包含分号的多条SQL了。
补充说明
PhpMyAdmin默认允许执行多语句SQL,而Go的MySQL驱动则默认关闭此功能,这就是为什么同一段SQL在两个环境中表现不同的原因。优先推荐拆分语句执行的方式,避免不必要的安全风险。
内容的提问来源于stack exchange,提问作者Wuttinan
相关产品推荐
相关产品推荐

