GoからMySQLに接続するための推奨される方法は何ですか?


163

GoからMySQLデータベースに接続するための信頼できるソリューションを探しています。周りにいくつかのライブラリを見てきましたが、完全性と現在のメンテナンスのさまざまな状態を判断するのは困難です。複雑なニーズはありませんが、人々が依存しているもの、またはMySQLに接続するための最も標準的なソリューションは何かを知りたいです。

回答:


263

いくつかのドライバーが利用可能ですが、データベース/ SQL API を実装するドライバーのみを考慮する必要があります

  • クリーンで効率的な構文を提供し、
  • これにより、インポートと接続を除いて、コードを変更せずにドライバーを後で変更できるようになります。

MySQLには2つの高速で信頼性の高いドライバーが用意されています。

私はそれらの両方を本番環境で使用しました。プログラムは何百万もの接続数で何ヶ月も実行され、失敗することはありません。

他のSQLデータベースドライバーはgo-wikiにリストされています

MyMySQLを使用する場合のインポート:

import (
    "database/sql"
    _ "github.com/ziutek/mymysql/godrv"
)

Go-MySQL-Driverを使用する場合のインポート:

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

MyMySQLを使用した接続と終了:

con, err := sql.Open("mymysql", database+"/"+user+"/"+password)
defer con.Close()
// here you can use the connection, it will be closed when function returns

Go-MySQL-Driverを使用した接続と終了:

con, err := sql.Open("mysql", store.user+":"+store.password+"@/"+store.database)
defer con.Close()

1つの行を選択:

row := con.QueryRow("select mdpr, x, y, z from sometable where id=?", id)
cb := new(SomeThing)
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)

複数の行を選択し、結果を含む配列を作成します。

rows, err := con.Query("select a, b from item where p1=? and p2=?", p1, p2)
if err != nil { /* error handling */}
items := make([]*SomeStruct, 0, 10)
var ida, idb uint
for rows.Next() {
    err = rows.Scan(&ida, &idb)
    if err != nil { /* error handling */}
    items = append(items, &SomeStruct{ida, idb})
}

挿入:

_, err = con.Exec("insert into tbl (id, mdpr, isok) values (?, ?, 1)", id, mdpr)

MySQLでのGoでの作業は楽しい経験であることがわかります。問題が発生したことはありません。サーバーは何ヶ月もエラーやリークなしで稼働しています。ほとんどの関数が可変数の引数を取るだけであるという事実は、多くの言語で面倒な作業を軽減します。

今後、別のMySQLドライバーを使用する必要がある場合は、1つのgoファイルで2行を変更する必要があることに注意してください。インポートを実行する行と、接続を開く行です。


2
本当にありがとうございました。Goがライブラリーが実装できるdatabase / sqlパッケージを提供しているのが気に入っています。
セルジマンシージャ

9
初心者のための優れた入門書。ありがとう。
Rick-777

5
テストされたドライバーのリスト(他のDBMSの場合も)は、code.google.com / p / go - wiki / wiki / SQLDriversで入手できます。2番目の人気のあるMySQLドライバーがあります:github.com/Go-SQL-Driver/MySQL(筆者筆記)
ジュリアンシュミット

1
@JulienSchmidt私はあなたのリンクを参照するために私の答えを編集しました。これら2つのドライバーの比較へのリンクがある場合は、それを歓迎します。
DenysSéguret2013年

1
@Zeynelこれは単なる例です(この個人プロジェクトから取得)。に置き換えて編集しましたSomeThing。その行のポイントは、中間変数なしでクエリの結果を構造体に直接入力する方法を示すことです。
DenysSéguret2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.