Ich versuche, einen MySql-Treiber zu finden, den ich mit Go verwenden kann, das die Ausgabe mehrerer SQL-Anweisungen in einem Aufruf unterstützt. Zum Beispiel könnte ich wünsche eine Datenbank mit dem folgende SQL zu erstellen:Existiert ein Go Mysql-Treiber, der mehrere Anweisungen innerhalb einer einzelnen Zeichenfolge unterstützt?
DROP SCHEMA IF EXISTS foo;
CREATE SCHEMA IF NOT EXISTS foo;
In Sprachen wie PHP können Sie nur die beiden SQL-Anweisungen in einer Zeichenfolge platzieren und es in einem Rutsch ausführen, wie folgt aus:
$db = new PDO(...);
$db->query("DROP SCHEMA IF EXISTS foo; CREATE SCHEMA IF NOT EXISTS foo;");
Der Grund, warum ich das brauche, ist, weil ich SQL-Dumps habe (von mysqldump
) Ich möchte programmgesteuert auf verschiedene Datenbanken anwenden.
Ich bin auf der Suche nach der gleichen Funktionalität in Go, aber es scheint, dass die verschiedenen Treiber es nicht unterstützen, was, offen gesagt, ist schockierend für mich.
Go-MySQL-Treiber
https://github.com/go-sql-driver/mysql
Dies scheint die am häufigsten verwendeten Treiber für Go zu sein.
package main
import "database/sql"
import "log"
import _ "github.com/go-sql-driver/mysql"
func main() {
db, err := sql.Open("mysql", "user:[email protected](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()
}
Ausgang:
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
Dies ist ein weiterer beliebter Fahrer.
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()
}
Ausgang:
2015/02/16 18:58:08 packet sequence error
Kennt jemand jeden MySQL-Treiber kompatibel mit Go, die mehrere Anweisungen in einer Zeichenfolge wie diese verarbeiten kann?
Go MySQL Driver hat jetzt Multi-Statement-Unterstützung: https://github.com/go-sql-driver/mysql/pull/411 –