Goweb ごり押しでDB連携してみる
検索してみると、どうも意気込みだけ(〜すれば良いらしいとか)書いて有って、ソースやレクチャが日本語ページで見つからない。
(´ヘ`;)ウーム…ワシと同じやないですか。
なので、この辺を参考に、無理矢理組み込んでみる。
PostgreSQLとの連携っす。
import ( "database/sql" "errors" _ "github.com/lib/pq" "github.com/stretchr/goweb" "github.com/stretchr/goweb/context"
pqを読み込む。
Webシステムでは希な、main起動っぽいので、最初に読み込む事に。
タイミングは・・・適当に
func main() { // map the routes mapRoutes() // データベース接続 dbInit()
var db *sql.DB func dbInit() { var err error db, err = sql.Open("postgres", "user=oshienai password=himitsu host=192.16*.*.** dbname=maruhi sslmode=disable") if err != nil { log.Printf("データベースの接続に失敗しました。: %v", err) } // コネクションプール APIドキュメントで見つけた db.SetMaxIdleConns(5) // データベースに接続するため、実際は不要 err = db.Ping() if err != nil { log.Printf("データベースの接続に失敗しました。2: %v", err) } // defer db.Close() // ここで、クローズすると、関数抜けたらすぐ実行されるぽ // なので、やっちゃぁ駄目だお } func dbClose() { log.Println("データベースの接続を解除しました。") defer db.Close() }
いろいろ、そのままパクリました。
んで、dbCloseのタイミングなんですが、いろいろ試して、
// stop the HTTP server log.Print("Stopping the server...") listener.Close() defer dbClose()
にしました。goルーチンの中のさらにその中のルーチンで、(´ヘ`;)ウーム…
今の私には、説明できません。ツッコミあらば、米下さい。
取り敢えず、今はここにしております。
後は、適当に既存のソースでも新たにコントローラー作成するなりして、実行してみる。
func (r *ThingsController) Read(id string, ctx context.Context) error { query := "select id, name from users where id = $1" rows, err := db.Query(query, id)
取り敢えず、usersというテーブルとレコードはあるっつぅ前提。
Posterで実行してみる。
うまくいった。
けど、これで良いんですかね??
まぁ実験的位置づけとして。