読者です 読者をやめる 読者になる 読者になる

備忘録

なんとなく暇なときにでも....

golangのechoフレームワークを使ってRestfulAPIを作る ~DBへの接続。SELECTする。~

本日はサブタイトル通り”MySQLに接続して、テーブルからSELECTする。”です。

私は開発環境にDockerを使用しているのですが、初めて”別のコンテナを立てて、そのコンテナに現在動いているコンテナからアクセスする”といったことをやりました。
案外サクッとできてDockerのメリットを初めて個人の開発で実感したかもしれません。
これに関しては本日のテーマとは逸れるので別の機会に。


golangのORマッパーとしては、gormやgorpなどもありますが、dbrを使用しました。(dbrについては下記のURLを参考URLを載せておきます。)

使い方は以下の通り(例にもよって1ファイルにまとめていますが、実際のソースでは複数ファイルに分けています。)

import (
    _ "github.com/go-sql-driver/mysql"     //←これ!
    "github.com/gocraft/dbr"           //←これ!
)

type (
    Users struct {
                Id         int64   `db:"id"`
                Name   string  `db:"name"`
                Age      int    `db:"age"`
    }
)


func main() {
    e := echo.New()
 
    /**
    * Middleware
    */
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
 
    /**
    * Routing
    */
    e.GET("/users", ConnectDB)
 
    // Start server
    e.Logger.Fatal(e.Start(":3000"))
}


func ConnectDB(c echo.Context ) error{
    // mysqlへの接続設定
    // dbr.Open("mysql", "[mysql_username]:[mysql_passwd]@tcp( [接続先のmysqlコンテナのホストネーム] :3306)/[接続DB名]", nil)
    conn, err := dbr.Open("mysql", "username:passwd@tcp(127.0.0.1:3306)/test_db", nil)
    if err != nil{
        return err
    }

   //sess を利用して DB を操作する
    sess := conn.NewSession(nil)

    var user []Users
   // [{"Id": ,"Name":, "Age":}]


    // select * from users で取得した結果をuser構造体にバインドする。
    sess.Select("*").From("users").Load(&user)
 
    // [{"Id":1,"Name":"hogehoge","Age":24}]
    return c.JSON(http.StatusCreated, user)
}

usersテーブルにはid, name, ageカラムがそれぞれint, varchar, intで設定していました。

-- users table
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(16) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

対応したカラム名をUsers構造体で定義することでクエリを実行した結果を、初期化された構造体にバインドしてくれてます。

いやー。少しづつですができてきましたね。(まだ序盤中の序盤ですが…….)

本日はここまで