2012-07-05 16 views
140

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

答えて

245

いくつかのドライバが用意されていますが、あなただけ

  • としてdatabase/sql APIを実装しているもの、それはクリーンで効率的な構文を提供し、
  • それはあなたが後にコードを変更せずにドライバを変更することができ確実に考慮すべきです、インポートと接続を分離します。

2つの高速かつ信頼性の高いドライバーは、MySQLのために用意されています

は、私が接続して数ヶ月のために、プログラムが実行されている生産でそれらの両方を使用しました数百万の数字が失敗することはありません。

他のSQLデータベースドライバare listed on go-wiki

インポート使用してMyMySQL:MyMySQL接続

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

と使用して終了:ゴーMySQLのドライバを使用して

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

インポート

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のドライバを使用して閉じること:複数の行を選択し、結果の配列を構築

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}) 
} 

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

一つの行を選択

挿入は:

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

あなたは、MySQLと一緒に行くに作業は楽しい経験であることがわかります。私は問題を抱えていたことはありません、私のサーバーは、エラーやリークなしヶ月間実行します。ほとんどの関数が単純に可変引数を取るという事実は、多くの言語で面倒な作業を軽減します。

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

+2

ありがとう、私はそれを試してみましょう。私は、ライブラリが実装できるデータベース/ SQLパッケージをGoに提供しています。 – GiantSquid

+0

これは、他の言語(JDBCなど)に存在するものと似ていますが、よりクリーンで軽い構文です。 –

+8

初心者のための優れたプライマー。ありがとう。 –

0

いくつ 選択1行の例注意:この例では行方不明row.Next()がある

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) 

を。返される最初の行を取得するためにrow.Next()に電話する必要があります。

また、何らかの形でデータミニマリズムを促進しようとするライブラリにいくらか柔軟性がありません。スキャンではない列を選択しようとすると、エラー(単に警告ではない)がスローされます

+2

これは正確ではありません。QueryRow関数は* Rowを返します。この関数は、クエリが単一の行を返すことを示します。 Query()はrows.Next()を呼び出す必要がある(* Rows、error)を返します。 –