node.jsフレームワーク「Adonis」(3)
前回はMVCのV(View)とC(Controller)に軽く触れてみましたので、今回はM(Model)です。
と言ってもMVCのM(モデル)については人それぞれいろいろな意見がありますので、「今回はDBを扱うORマッパーを取り上げます。」と言い直します。
Laravelでの「Eloquent ORM」に相当する、「Lucid ORM」がAdonisには存在します。AdonisのTutorialに沿って、Post(投稿)モデルを作成してみます。以下コマンドを実行します。
administrators-MacBook-Air:adonistest2 xxxxxx$ ./ace make:model Post create: app/Model/Post.js
「app/Model」以下にPostクラスが作成されました。(Laravelと違ってModelディレクトリがあらかじめ存在しています)
'use strict' const Lucid = use('Lucid') class Post extends Lucid { } module.exports = Post
DB定義を行います。Laravel同様migrationの仕組みを持っていますのでこれで行います。
まず以下コマンドでpostsテーブル作成用のmigrationファイルを作成します。
administrators-MacBook-Air:adonistest2 xxxxxx$ ./ace make:migration posts --create=posts create: database/migrations/1472777565816_posts.js
作成されたmigrationファイル(database/migrations/1472777565816_posts.js)にテーブル定義を記述していきます。
'use strict' const Schema = use('Schema') class PostsSchema extends Schema { up () { this.create('posts', (table) => { table.increments() table.string('title') table.text('content') table.timestamps() }) } down () { this.drop('posts') } } module.exports = PostsSchema
作成された雛形に’title’と’content’の定義を追加しました。
内容的にはLaravelのmigrationそっくりなのでLaravelのmigrationの知識ですんなに理解できそうです。
早速migration実行、といきたいところですが、DBの接続設定を確認しましょう。Adonisも.envファイルを使用しており、.envファイルの記述”DB_CONNECTION=sqlite”と、DB設定用ファイルapp/config/database.jsの記述から、デフォルトではSQLiteが使用されることがわかります。
connection: Env.get('DB_CONNECTION', 'sqlite'), sqlite: { client: 'sqlite3', connection: { filename: Helpers.databasePath('development.sqlite') }, useNullAsDefault: true }, ....
今回はお手軽にそのままSQLiteを使用します。
npmからsqliteドライバーをインストールして…
npm i --save sqlite3
migration実行します。
administrators-MacBook-Air:adonistest2 xxxxxx$ ./ace migration:run
テストデータをLaravelのようにseedファイルで挿入してみます。
const Factory = use('Factory') const Post = use('App/Model/Post') class DatabaseSeeder { * run () { for(let i = 1; i <= 3; i++) { let data = { title: 'タイトル' + i, content: 'タイトル' + i + 'の記事内容' }; yield Post.create(data) } } } module.exports = DatabaseSeeder
簡単に投稿データを3件作ってみます。下記コマンドでseed実行。
administrators-MacBook-Air:adonistest2 xxxxxx$ ./ace db:seed seeded database successfully
…成功のメッセージが出てるのになぜかコマンドから帰ってきません。
Ctrl+Cで終了させましたが何か書き方がまずかったのでしょうか?
SQLiteの中身をコマンドで確認してみます。
administrators-MacBook-Air:adonistest2 xxxxxx$ sqlite3 database/development.sqlite SQLite version 3.8.10.2 2015-05-20 18:17:19 Enter ".help" for usage hints. sqlite> .tables adonis_schema posts sqlite> select * from posts; 1|タイトル1|タイトル1の記事内容|2016-09-02 11:27:48|2016-09-02 11:27:48 2|タイトル2|タイトル2の記事内容|2016-09-02 11:27:48|2016-09-02 11:27:48 3|タイトル3|タイトル3の記事内容|2016-09-02 11:27:48|2016-09-02 11:27:48 sqlite>
データは投入されてました。ES6含めもう少し使いこなすには勉強が必要と感じました。