You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:37:47