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で実行してみる。

うまくいった。

けど、これで良いんですかね??
まぁ実験的位置づけとして。