2017年3月2日木曜日

go-swagger で MySQL に接続する方法

概要

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 件のコメント:

コメントを投稿