【报错内容】
Sorry, can not exec into mysql: Error 1064 (42000): 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 ...
【原因】
sql.Exec
在大多数情况下只能执行单条SQL语句。如果您的SQL脚本包含多条语句,您需要将它们分割并逐一执行。这通常涉及将整个SQL脚本内容按照语句分隔符(通常是分号 ;
)分割成单独的语句,然后逐个执行。
如果需要执行两条MySQL语句,一定要分开来执行sql.Exec(),这里使用split函数来进行语句拆分。
如下:
package mainimport ("database/sql""fmt""log""strings"_ "github.com/go-sql-driver/mysql"
)func main() {// 数据库连接设置dsn := "username:password@tcp(host:port)/dbname"db, err := sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}defer db.Close()// 测试数据库连接if err = db.Ping(); err != nil {log.Fatal(err)}// SQL命令sqlCommands := `DROP TABLE IF EXISTS combinedData;CREATE TABLE combinedData(ProducerName VARCHAR(255));`// 按分号分割命令commands := strings.Split(sqlCommands, ";")for _, cmd := range commands {// 去除字符串首尾的空白字符cmd = strings.TrimSpace(cmd)if cmd != "" {// 执行SQL命令_, err = db.Exec(cmd)if err != nil {log.Fatal("执行SQL出错: ", err)}}}fmt.Println("所有SQL命令执行完成")
}
这段代码将按照分号将SQL命令分割成单独的语句,并逐一执行它们。请注意,这种方法适用于简单的SQL脚本,但可能无法处理更复杂的情况,比如含有分号的SQL字符串或存储过程。对于更复杂的情况,您可能需要更精细的解析方法或直接在数据库管理工具中执行复杂脚本。