Nim 言語で RESTful API 作ってみた 2(MySQL編)

前回はルーティングを設定し、json 形式のレスポンスを返すところまでやったので、今回は MySQL と連携してユーザ一覧情報を返すようにしたいと思います

enomotodev.hatenablog.com

MySQL でテストデータ作成

MySQL に直接接続して、テスト用のデータベース・テーブル・データを作成します

CREATE DATABASE test_db;

use test_db;

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO users (name) VALUES ("foo"), ("bar"), ("baz");

テストデータを確認してみます

SELECT * FROM users\G
*************************** 1. row ***************************
  id: 1
name: foo
*************************** 2. row ***************************
  id: 2
name: bar
*************************** 3. row ***************************
  id: 3
name: baz
3 rows in set (0.00 sec)

これでテストデータの作成は完了です

ユーザ情報取得

テストデータの作成が完了したので、ID からユーザ情報を取得できるようにしていきます

まずは MySQL に接続する初期設定を書いてみます

import jester, asyncdispatch, json, db_mysql  # ①

let db = open("localhost", "user", "password", "test_db")  # ②
  1. importdb_mysql を追加します
  2. ここで MySQL に接続する設定情報を記述します

次に ID からユーザ情報を取得して json としてレスポンスを返すようにします

  get "/users/@id":
    var row = db.getRow(sql"select * from users where id = ?", @"id") # ③
    var data = %*{"id": row[0], "name": row[1]} # ④
    resp $data, "application/json"
  1. ここで SQL を発行して、DB からデータを配列として取得しています
  2. ユーザ情報を配列として保持しているので、ハッシュにし、それを json 型にキャストしています

これで ID から単一ユーザ情報を取得できるようになったので、実行して確認しています

f:id:enomotodev:20171008120716p:plain

取得できました!

ユーザ一覧情報取得

/users という URL でユーザの一覧情報も取得できるようにしたいと思います

  get "/users":
    var rows = db.getAllRows(sql"select * from users")
    var users: seq[JsonNode] # ⑤
    users = @[] # ⑥
    for row in rows:
      users.add(%*{"id": row[0], "name": row[1]}) # ⑦
    var data = %*{"total": users.len, "users": users}
    resp $data, "application/json"
  1. json 型の配列の users を定義し
  2. 空配列で初期化しています
  3. ここで json 型のユーザ情報を users に追加しています

これで実行するとユーザの一覧情報が取得できます

f:id:enomotodev:20171008122103p:plain

ここまでのコードはこんな感じです

import jester, asyncdispatch, json, db_mysql

let db = open("localhost", "user", "password", "test_db")

routes:
  get "/":
    resp "Hello World!"
  get "/users":
    var rows = db.getAllRows(sql"select * from users")
    var users: seq[JsonNode]
    users = @[]
    for row in rows:
      users.add(%*{"id": row[0], "name": row[1]})
    var data = %*{"total": users.len, "users": users}
    resp $data, "application/json"
  get "/users/@id":
    var row = db.getRow(sql"select * from users where id = ?", @"id")
    var data = %*{"id": row[0], "name": row[1]}
    resp $data, "application/json"

runForever()

まとめ

ここまでで MySQL と連携し、ユーザ情報を取得するところまでできたので、次はユーザ情報を新規作成したり、更新するところをやっていきたいと思います

次の記事

enomotodev.hatenablog.com

Nim in Action

Nim in Action