expressを使ったbookshelfの操作方法について書かれております。
Bookshelfとは
SQLを使わずデータベースを使うことができるORM
Bookshelfは、 Knex SQLクエリビルダー上に構築されたNode.js用のJavaScript ORMです。 Promiseベースのコールバックインターフェイスと従来のコールバックインターフェイスの両方、トランザクションサポート、eager / nested-eagerリレーションのロード、ポリモーフィックな関連付け、1対1、1対多、および多対多のリレーションのサポートを備えています。
PostgreSQL、MySQL、SQLite3で動作するように設計されています。
knexとは
Bookshelfは、内部で「クエリービルダー」と呼ばれるknexモジュールを利用しています。ですから、インストールの際には、まずknexを入れておく必要があります。
良く分からないけど、Bookshelfを使う際にはついてくる物らしい。。。
モジュールのインストール
npm install--save knex
npm install--save bookshelf
Bookshelfの初期設定
varknex=require('knex')({client:'mysql',connection:{host:'127.0.0.1',user:'root',password:'',database:'データベース名',charset:'utf8'}});varBookshelf=require('bookshelf')(knex);varMydata=Bookshelf.Model.extend({tableName:'Mydata(テーブル名)'});
上記のコードで行っている事は、
knexのロード、
knexの初期設定、
Bookshelfのロード、
モデルの作成
モデルとは?
テーブルにアクセスするオブジェクトです。
これを使って、テーブルのデータをCRUD操作します。
モデルの項目追加
hasTimestamps:true | タイムスタンプのデータをレコードに追加する |
---|---|
user: function() {return this.belongsTo(テーブル名) | 他のテーブルの値を取得可能にする |
これでBookshelfの初期設定は完了しました。
いよいよ、CRUD操作をしていきます。
Bookshelfのメソッド
Bookshelfで操作する際に使用するメソッドです。使いながら覚えていきましょう。
fetchAll | 全てのレコードを取得する物 |
---|---|
then | データベースアクセス完了後の処理をコールバック関数として設定します。 |
catch | thenを実行した時にエラーが発生した時の処理です。 |
save | オブジェクトの引数をテーブルに保存する処理をします。 |
where | 検索する対象に条件を設定して絞り込む |
fetch | 最初の一つだけレコードを取り出す。 |
fetchPage | 得られたページ番号を元にレコードを取り出します。 |
orderBy | レコードを並べ変える。 |
query | 複数項目をチェックすする |
レコードを取り出す
全レコードを取り出す
newMydata().fetchAll().then((collection)=>{-----取得できた場合の処理-----}).catch((err)=>{-----エラー発生時の処理-----});
レコードを保存する
新しいレコードの追加をしていきます。
router.post('/add',(req,res,next)=>{newMydata(req.body).save().then((model)=>{ー追加した後の操作ー});});
検索
router.post('/',(req,res,next)=>{nexMydata().where('id','=',req.body.fstr).fetch().then((collection)=>{取得後の操作}}
レコードを並べかえる
router.get('/:page',(req,res,next)=>{nexMessage().orderBy('created_at','DESC').fetchAll().then((collection)=>{取得後の操作});})
orderByについて
第一引数にフィールド名、第二引数には「ABC」「DESC」の何かを指定します。
(DESCなら降順、ABCなら逆順)
複数項目をチェックする
router.post('/',(req,res,next)=>{varnm=req.body.name;varpw=req.body.password;Mydata.query({where:{name:nm},andWhere:{password:pw}}).fetch().then((model)=>{取得後の操作})})
関数query()に関して
where:{name: nm} | nameの値が変数nmである |
---|---|
andWhere:{password: pw} | それに加えて、passwordの値が変数pwである |
ページネーション
Bookshelfを使う事で、ページネーションも使えるようになります。
router.get('/:page',(req,res,next)=>{varpg=req.params.page;pg*=1;if(pg<1){pg=1;}newMyData().fetchPage({page:pg,pageSize:3}).then((collection)=>{取得した後の操作}).catch((err)=>{エラーを取得した後の操作}}
関数.fetchPageに関して
page | 現在のページ番号 |
---|---|
pageCount | ページ数(最後のページのページ番号) |
pageSize | 1ページ辺りのレコード数 |
rawCount | レコードの総数 |
参考
node.js超入門第2版
Bookshelfとは
https://bookshelfjs.org/
paginationプラグイン
https://github.com/bookshelf/bookshelf/wiki/Plugin:-Pagination