概要
go-swagger + mysql でデータベースからデータを取得する方法を紹介します
使用するアプリケーションはこれまでに作成した TODO アプリを使用します
環境
- CentOS 6.7 64bit
- go-swagger dev
- golang 1.6
- MySQL 5.6.28
ライブラリインストール
- go get github.com/go-sql-driver/mysql
で import 文に上記を記載してください
また、MySQL のインストールと test データベースの作成と test_table というテーブルの作成を行っておいてください
MySQL に接続するユーティリティの作成
configure_todo_list.go と同じディレクトリに作成しました
これだと同じパッケージに属することができるので、import を別途記載する必要がありません
- vim restapi/mysql.go
package restapi
import (
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type MySQL struct {
host string
port string
user string
password string
dbname string
con *sql.DB
}
func (mysql *MySQL) connect() (err error) {
mysql.con, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", mysql.user, mysql.password, mysql.host, mysql.port, mysql.dbname))
if err != nil {
return err
}
return nil
}
func (mysql *MySQL) close() (err error) {
err = mysql.con.Close()
if err != nil {
return err
}
return nil
}
// Test Method
func (mysql *MySQL) showTable() (err error) {
err = mysql.connect()
if err != nil {
return err
}
defer mysql.close()
query := "SELECT name FROM test_table"
rows, err := mysql.con.Query(query)
if err != nil {
return err
}
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
return err
}
fmt.Println(name)
}
return nil
}
func NewMySQL() (mysql *MySQL) {
mysql = new(MySQL)
mysql.host = "localhost"
mysql.port = "3306"
mysql.user = "root"
mysql.password = ""
mysql.dbname = "test"
return mysql
}
ちょっと長いですが簡単です
struct を使って MySQL に接続するデータを管理しています
そして、NewMySQL
メソッドで構造体を生成します
あとは生成した構造体に対して、用意したテストメソッドをコールするだけです
ロジック側でコールする
- vim restapi/configure_todo_list.go
// mysql
var test = NewMySQL()
api.TodosFindTodosHandler = todos.FindTodosHandlerFunc(func(params todos.FindTodosParams) middleware.Responder {
mergedParams := todos.NewFindTodosParams()
mergedParams.Since = swag.Int64(0)
if params.Since != nil {
mergedParams.Since = params.Since
}
if params.Limit != nil {
mergedParams.Limit = params.Limit
}
test.showTable() // -> ここに追記
return todos.NewFindTodosOK().WithPayload(allItems(*mergedParams.Since, *mergedParams.Limit))
})
今回はテーブルの中身を表示するだけなので、作成した構造体に対してテスト用のメソッドをコールしているだけです
これでアプリをビルドし直して起動し curl で GET の部分にアクセスすると test_table に insert したレコードの情報が表示されると思います
- go fmt restapi/configure_todo_list.go
- go fmt restapi/mysql.go
- go install ./cmd/todo-list-server/
todo-list-server --port=18080 --host=0.0.0.0
curl -H "Content-Type: application/json" -XGET localhost:18080/v1
でアプリを実行しているターミナルの標準出力にレコードの情報が表示されるはずです
最後に
go-swagger + mysql を試してみました
単純にユーティリティファイルを作成してそれを読んでいるだけなので、特に go-swagger だからと言って特殊なことはしていません
ちょっと正しいやり方がわからなかったのでこのやり方にしていますが、もしかしたら setupGlobalMiddleware を使ってミドルウェアとして使ったほうが作法的にはいいのかもしれません
0 件のコメント:
コメントを投稿