スマレジエンジニアyushiのブログ

スマレジエンジニアのブログ

【TODOリスト 第4回】GoでDBに接続する

引き続きTODOリストを作っていきます。

yushi-dev.hatenablog.com

今回は、GoでDBに接続します。

使い慣れているMySQLを利用します。

下記の書籍を参考にさせていただいています。

DB連携環境

Pull Requestはこちら

https://github.com/nek0meshi/todo-list/pull/5

docker-composeの設定です。

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: sample
      MYSQL_USER: sample
      MYSQL_PASSWORD: sample
      TZ: 'Asia/Tokyo'
    command: mysqld
    volumes:
      - db-data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf:ro
      - ./environment/sql:/work/sql:ro
    working_dir: /work

volumes:
  db-data:

mysql:8を使っています。

volumes: db-dataを定義し、データの管理はDockerにやってもらいます。

GOの環境用にDockerfileを作ります。

FROM golang:1-alpine

RUN apk add --no-cache git

RUN go get -u github.com/go-sql-driver/mysql

mysqlへの接続のためのライブラリ go-sql-driver/mysqlをdownloadするのと、そのためにgitを導入しています。

プログラム

MySQLサーバと接続します。

    db, err = sql.Open("mysql", "sample:sample@tcp(db:3306)/sample")

DBからデータを取得し、定義した構造体Taskに値を代入します。

   err = db.QueryRow("SELECT * FROM tasks WHERE id = ?", 1).Scan(&task.ID, &task.Name, &task.Status)

リクエストに対して、Hello World! タスク1!と返却します。
タスク1は、DBから取得したレコードのnameカラムです。
(雑なセンテンスですが、前回の実装をそのまま使ったため...。 )

   fmt.Fprintf(w, "Hello World! %s!", load())

ブラウザから呼び出すとこんな感じです。

プログラム終了時にDB接続を解除します。
deferは、メソッドの最後に呼ばれる模様...)

   defer db.Close()

まとめ

今回は簡単なDB接続を行いました。
次回からはTODOリストとしての機能を実装していく予定です。