Bookshelfは、Knex SQLクエリビルダーの上に構築されたnode.jsのJavaScript ormです。約束ベースと従来のコールバックインターフェイス、トランザクションサポート、熱心な/ネストされた関係の負荷、多型の関連性、1対1、1対多、および多くの関係のサポートを備えています。
PostgreSQL、MySQL、およびSQLite3で動作するように設計されています。
ウェブサイトとドキュメント。このプロジェクトはGitHubでホストされており、包括的なテストスイートがあります。
Bookshelfは、JavaScriptのデータベースを照会し、これらのオブジェクト間の関係を形成する際に、一般的なタスクに簡単なライブラリを提供し、データマッパーパターンから多くのアイデアを取得することを目指しています。
簡潔で読み書きのできるコードベースを使用すると、Bookshelfは簡単に読み、理解し、拡張できます。特定の検証スキームを使用することは強制されず、柔軟で効率的な関係/ネストリレーションロードとファーストクラスのトランザクションサポートを提供します。
これは、無駄のないオブジェクトリレーショナルマッパーであり、ストックコンベンションに完全に適合しないカスタムクエリが必要なときはいつでも、生のネックスインターフェイスにドロップダウンできます。
NPMからKNEXとmysql
、 pg
、またはsqlite3
のコピーをインストールする必要があります。
$ npm install knex
$ npm install bookshelf
# Then add one of the following :
$ npm install pg
$ npm install mysql
$ npm install sqlite3
本棚ライブラリは、初期化されたKnexクライアントインスタンスを渡すことにより初期化されます。 KNEXドキュメントは、さまざまなデータベースの多くの例を提供します。
// Setting up the database connection
const knex = require ( 'knex' ) ( {
client : 'mysql' ,
connection : {
host : '127.0.0.1' ,
user : 'your_database_user' ,
password : 'your_database_password' ,
database : 'myapp_test' ,
charset : 'utf8'
}
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
// Defining models
const User = bookshelf . model ( 'User' , {
tableName : 'users'
} )
この初期化は、おそらくアプリケーションで一度だけ発生するはずです。現在のデータベースの接続プールを作成するため、ライブラリ全体に返されるbookshelf
インスタンスを使用する必要があります。 [アプリケーションのどこかに初期化]によって作成されたこのインスタンスを保存する必要があります。そうすれば、参照できます。従うべき一般的なパターンは、モジュール内のクライアントを初期化することです。そうすることで、後で簡単に参照できます。
// In a file named, e.g. bookshelf.js
const knex = require ( 'knex' ) ( dbConfig )
module . exports = require ( 'bookshelf' ) ( knex )
// elsewhere, to use the bookshelf client:
const bookshelf = require ( './bookshelf' )
const Post = bookshelf . model ( 'Post' , {
// ...
} )
これがあなたを始めるための例です:
const knex = require ( 'knex' ) ( {
client : 'mysql' ,
connection : process . env . MYSQL_DATABASE_CONNECTION
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
const User = bookshelf . model ( 'User' , {
tableName : 'users' ,
posts ( ) {
return this . hasMany ( Posts )
}
} )
const Post = bookshelf . model ( 'Post' , {
tableName : 'posts' ,
tags ( ) {
return this . belongsToMany ( Tag )
}
} )
const Tag = bookshelf . model ( 'Tag' , {
tableName : 'tags'
} )
new User ( { id : 1 } ) . fetch ( { withRelated : [ 'posts.tags' ] } ) . then ( ( user ) => {
console . log ( user . related ( 'posts' ) . toJSON ( ) )
} ) . catch ( ( error ) => {
console . error ( error )
} )
.set()
の場合はいつでも、値の変換を処理するカスタムプロセッサ関数を定義できます。 Model
を拡張し、タイムスタンプの追加、属性検証、いくつかのネイティブCRUDメソッドを拡張する代替手段。図書館について質問がありますか? knex.jsとbookshelf.jsでサポートするために#BookShelf Freenode IRCチャンネルにご参加ください。または、Stack Overflowの問題を投稿してください。
本棚に貢献したい場合は、通常、問題を報告するか、プルレクエストを送信したいと思います。この目的のために、オンラインリポジトリはGitHubで利用できます。
地元の開発環境の設定や本棚への貢献方法をさらに学ぶために、GitHubで利用可能な寄稿文書を読む必要があります。
はい、 .asCallback(function(err, resp) {
任意のデータベース操作方法で呼び出し、必要に応じて標準(err, result)
スタイルのコールバックインターフェイスを使用できます。
フェッチされている初期モデルに渡された初期パラメーターのタイプが正しいことを確認してください。たとえばnew Model({id: '1'}).load([relations...])
new Model({id: 1}).load([relations...])
IDが1つのケースの文字列であり、もう1つの場合は数字であること。これは、URLパラメーターからIDを取得する場合、一般的な間違いです。
これは、最初に元のモデルを取得せずにロードでデータをロードすることを切望している場合にのみ問題です。 new Model({id: '1'}).fetch({withRelated: [relations...]})
正常に動作するはずです。
ここでの問題は、Bookshelfが使用するデータベース抽象化レイヤーであるKnexが接続プーリングを使用して、データベース接続を開いたままにすることです。スクリプトが終了した後にプロセスを終了したい場合は、 Bookshelf
インスタンスのknex
プロパティまたは初期化中に通過したKnex
インスタンスで.destroy(cb)
に電話する必要があります。接続プーリングの詳細については、Knex Docsでご覧いただけます。
debug: true
Options Object to Your knex
Initialize Callに合格すると、すべてのクエリ呼び出しが行われていることがわかります。 model.fetch()
やmodel.destroy()
など、データベースにアクセスするすべてのメソッドに同じオプションを渡すこともできます。例:
// Turning on debug mode for all queries
const knex = require ( 'knex' ) ( {
debug : true ,
client : 'mysql' ,
connection : process . env . MYSQL_DATABASE_CONNECTION
} )
const bookshelf = require ( 'bookshelf' ) ( knex )
// Debugging a single query
new User ( { id : 1 } ) . fetch ( { debug : true , withRelated : [ 'posts.tags' ] } ) . then ( user => {
// ...
} )
時には、さまざまな呼び出しに少し飛び込み、舞台裏ですべてが起こっていることを確認する必要があります。 Node-Inspectorを使用できます。これにより、ブラウザのようなdebugger
ステートメントでコードをデバッグできます。
Bookshelfは、 bluebird
Promise Libraryの独自のコピーを使用しています。デバッグの約束の詳細については、こちらをご覧ください。
アプリケーションコードの開始時に次のブロックを追加すると、通常のPromiseチェーンハンドラーにキャッチされていないエラーがキャッチされます。これは、デバッグに非常に役立ちます。
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
Githubの寄稿文書を参照してください。
主にnode.jsをターゲットにしていますが、すべての依存関係はブラウザに互換性があり、カスタムKnexアダプターを提供することにより、SQLite3データベースをサポートする他のJavaScript環境と連携するように適合させることができます。ただし、そのようなアダプターは存在しません。
Bookshelfを使用して次のプロジェクトを見つけましたが、さらに多くのプロジェクトがあります。