我正在尝试找到一个可以与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-Driverhttps://github.com/go-sql-driver/mysql这似乎是 Go 最常用的驱动程序。package mainimport "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 1MyMySQLhttps://github.com/ziutek/mymysql这是另一个流行的驱动程序。package mainimport "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 驱动程序可以处理这样一个字符串中的多个语句?
3 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
添加一个来自@ithkuil 的关于 go-sql-driver 包的 multiStatements 的答案示例以供参考。(我没有足够的代表作为评论添加)。
multiStatements 的参数被添加到 sql.Open 调用的 dataSourceName 字符串中。例如
db, err := sql.Open("mysql", "user:pass@tcp(localhost:3306)/dbname?multiStatements=true")
建议您不要使用这样的 db 处理程序来处理用户输入,但它非常适合处理已知的 sql 文件。
- 3 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消