knex.jsを用いてnode.jsでmysqlを使う

knex.jsとは

Node.js向けのSQLクエリービルダーです。

以下のデータベースに対応しています。

  • Postgres
  • MSSQL
  • MySQL
  • MariaDB
  • SQLite3
  • Oracle
  • Amazon Redshift

実際に使ってみる

今回はmysqlとのセットでknex.jsを使ってみます。

まず、今回使用するmysqlをdockerで用意します。以下のコマンドで、mysqlの動いているコンテナが起動します。

docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql:5 --character-set-server=utf8mb4

そして、以下のコマンドで、'db'という名前のデータベースを作成します。

echo 'CREATE DATABASE db' | mysql -h 127.0.0.1 -u root -ppassword

以下、このデータベースをknex.jsから操作することにします。

適当なディレクトリを作り、knexとmysqlをインストールします。

npm i knex mysql

同一ディレクトリ内で作業します。

knexをインポートし、clientを定義します。

const knex = require('knex');

const client = knex({
  client: 'mysql',
  connection: {
    host: '127.0.0.1',
    user: 'root',
    password: 'password',
    database: 'db',
  },  
});

以下で、'tbl'という名前のテーブルが定義できます。

client.schema.createTable('tbl', function (table) {
  table.increments();
  table.string('name');
  table.timestamps();
})
  .then(console.log);

これによって吐き出されたSQL文はこのようなものでした。賢いですね。

making query: create table `tbl` (`id` int unsigned not null auto_increment primary key, `name` varchar(255), `created_at` datetime, `updated_at` datetime)

なおconsoleへの出力は以下のような感じになります。

[ OkPacket {
    fieldCount: 0,
    affectedRows: 0,
    insertId: 0,
    serverStatus: 2,
    warningCount: 0,
    message: '',
    protocol41: true,
    changedRows: 0 },
  undefined ]

以下のようなコードで、'tbl'テーブルにレコードを挿入できます。2行挿入するためにPromise.allを使っています。

Promise.all([
  client('tbl').insert({
    name: 'hoge',
    created_at: client.fn.now(),
    updated_at: client.fn.now(),
  }),
  client('tbl').insert({
    name: 'foo',
    created_at: client.fn.now(),
    updated_at: client.fn.now(),
  }),
])
  .then(console.log);

consoleへの出力は以下のようになりました。1と2の順番が入れ替わるかもしれません。

[ [ 1 ], [ 2 ] ]

以下のようなコードで'tbl'テーブルからデータを取得できます。

client('tbl')
  .select('name', 'created_at', 'updated_at')
  .then(console.log);

consoleへの出力は以下のようになりました。mysqlモジュールの挙動と同じですね。

[ RowDataPacket {
    id: 1,
    name: 'hoge',
    created_at: 2018-11-06T14:12:45.000Z,
    updated_at: 2018-11-06T14:12:45.000Z },
  RowDataPacket {
    id: 2,
    name: 'foo',
    created_at: 2018-11-06T14:12:45.000Z,
    updated_at: 2018-11-06T14:12:45.000Z } ]

キリがないのでここで紹介する関数はこれくらいにしますが、もちろん他にも多数の関数があります。https://knexjs.org/ を参照してください。