LoginSignup
9
8

More than 3 years have passed since last update.

【node.js】bookshelfとknexを使ってCRUD操作

Last updated at Posted at 2020-04-06

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の初期設定


var knex = require('knex')({
    client: 'mysql',
    connection: {
        host    : '127.0.0.1',
        user    : 'root',
        password: '',
        database: 'データベース名',
        charset : 'utf8'
    }
});

var Bookshelf = require('bookshelf')(knex);

var Mydata = 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 複数項目をチェックすする

レコードを取り出す

全レコードを取り出す

new Mydata().fetchAll().then((collection) => {
  -----取得できた場合の処理-----
}).catch((err) => {
  -----エラー発生時の処理-----
});

レコードを保存する

新しいレコードの追加をしていきます。

router.post('/add', (req, res, next) => {
  new Mydata(req.body).save().then((model) => {
    ー追加した後の操作ー
  });
});

検索

router.post('/', (req, res, next) => {
  new Mydata().where('id', '=', req.body.fstr).fetch().then((collection) => {
    取得後の操作
  }
}

レコードを並べかえる

router.get('/:page', (req, res, next) => {
  new Message().orderBy('created_at', 'DESC').fetchAll().then((collection) => {
    取得後の操作
  });
})

orderByについて

第一引数にフィールド名、第二引数には「ABC」「DESC」の何かを指定します。
(DESCなら降順、ABCなら逆順)

複数項目をチェックする

router.post('/', (req, res, next) => {
  var nm = req.body.name;
  var pw = 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) => {
  var pg = req.params.page;
  pg *= 1;
  if(pg < 1){pg = 1; }
  new MyData().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

9
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8