是否存在支持单个字符串中的多个语句的 Go Mysql 驱动程序?

我正在尝试找到一个可以与Go 一起使用的 MySql 驱动程序,它支持在一次调用中发出多个 SQL 语句。例如,我可能希望使用以下 SQL 创建一个数据库:


DROP SCHEMA IF EXISTS foo;

CREATE SCHEMA IF NOT EXISTS foo;

在诸如 PHP 之类的语言中,您可以将两个 SQL 语句放在一个字符串中并一次性执行,如下所示:


$db = new PDO(...);

$db->query("DROP SCHEMA IF EXISTS foo; CREATE SCHEMA IF NOT EXISTS foo;");

我需要这个的原因是因为我有 SQL 转储(来自mysqldump)我想以编程方式应用于各种数据库。


我正在寻找 Go 中相同的功能,但似乎所有不同的驱动程序都不支持它,坦率地说,这让我感到震惊。


Go-MySQL-Driver

https://github.com/go-sql-driver/mysql

这似乎是 Go 最常用的驱动程序。


package main


import "database/sql"

import "log"

import _ "github.com/go-sql-driver/mysql"


func main() {


    db, err := sql.Open("mysql", "user:password@(127.0.0.1:3306)/")

    if err != nil {

        log.Println(err)

    }


    sql := "DROP SCHEMA IF EXISTS foo; CREATE SCHEMA IF NOT EXISTS foo;"

    _, err = db.Exec(sql)

    if err != nil {

        log.Println(err)

    }


    db.Close()

}

输出:


2015/02/16 18:58:08 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 SCHEMA IF NOT EXISTS foo' at line 1

MyMySQL

https://github.com/ziutek/mymysql

这是另一个流行的驱动程序。


package main


import "database/sql"

import "log"

import _ "github.com/ziutek/mymysql/godrv"


func main() {


    db, err := sql.Open("mymysql", "database/user/password")

    if err != nil {

        log.Println(err)

    }


    sql := "DROP SCHEMA IF EXISTS foo; CREATE SCHEMA IF NOT EXISTS foo;"

    _, err = db.Exec(sql)

    if err != nil {

        log.Println(err)

    }


    sql = "USE DATABASE foo;"

    _, err = db.Exec(sql) // <-- error

    if err != nil {

        log.Println(err)

    }


    db.Close()

}

输出:


2015/02/16 18:58:08 packet sequence error

有谁知道任何与 Go 兼容的 MySql 驱动程序可以处理这样一个字符串中的多个语句?


MM们
浏览 170回答 3
3回答

慕的地10843

添加一个来自@ithkuil 的关于 go-sql-driver 包的 multiStatements 的答案示例以供参考。(我没有足够的代表作为评论添加)。multiStatements 的参数被添加到 sql.Open 调用的 dataSourceName 字符串中。例如db,&nbsp;err&nbsp;:=&nbsp;sql.Open("mysql",&nbsp;"user:pass@tcp(localhost:3306)/dbname?multiStatements=true")建议您不要使用这样的 db 处理程序来处理用户输入,但它非常适合处理已知的 sql 文件。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go