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/ を参照してください。