【发布时间】:2015-04-17 09:14:19
【问题描述】:
我正在尝试找到一个 MySql 驱动程序,它可以与Go 一起使用,它支持在一次调用中发出多个 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 驱动程序可以处理这样的一个字符串中的多个语句?
【问题讨论】:
-
Go MySQL 驱动现在支持多语句:github.com/go-sql-driver/mysql/pull/411