Go MySQL Driver を使用した複数のステートメント
Go では、単一の文字列内で複数の SQL ステートメントを実行するのは困難な場合があります。この記事では、Go で利用可能な MySQL ドライバーを調べ、この機能のサポートについて調査します。
Go-MySQL-Driver
Go で最も人気のある MySQL ドライバーは go-sql です。 -ドライバー/mysql。ただし、そのデフォルト設定では、単一の文字列内の複数のステートメントはサポートされません。これは、質問で提供されているコード例で明らかであり、複数のステートメントを実行しようとすると、両方のドライバーでエラーが発生します。
構成のカスタマイズ
幸いなことに、 go-sql- driver/mysql を使用すると、接続パラメータをカスタマイズできます。 multiStatements パラメータを true に設定すると、単一の文字列で複数のステートメントを受け入れるようにドライバーを構成できます。
package main import ( "database/sql" "log" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := sql.Open("mysql", "user:password@(127.0.0.1:3306)/?multiStatements=true") 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() }
この変更により、コードは両方の SQL ステートメントをエラーなしで正常に実行できるようになりました。
代替ドライバー
別のオプションは、 github.com/ziutek/mymysql ドライバー。複数のステートメントを実行するための特別な構成は必要ありません。
package main import ( "database/sql" "log" _ "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) } db.Close() }
このドライバーは複数のステートメントをサポートしていますが、それほど広く使用されていない可能性があることに注意することが重要です。
注意事項
MySQLドキュメントでは、微妙なエラーが発生し、パフォーマンスに影響を与える可能性があるため、単一の文字列で複数のステートメントを実行しないように警告しています。通常は、代わりにストアド プロシージャまたはプリペアド ステートメントを使用することをお勧めします。それにもかかわらず、単一の文字列で複数のステートメントを実行できる機能は、SQL ダンプからのデータベースの復元などの特定のシナリオでは有益です。
以上がGo の MySQL ドライバーを使用して単一の文字列で複数の SQL ステートメントを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。