Bookshelf هو javaScript orm لـ node.js ، مبني على منشئ الاستعلام Knex SQL. إنه يتميز بكل من واجهات رد الاتصال القائمة على الوعد ودعم المعاملات وتحميل العلاقات المتداخلة/المتداخلة ، والجمعيات المتعددة الأشكال ، ودعم العلاقات الفردية والفردية ، والعديد من العلاقات.
إنه مصمم للعمل مع PostgreSQL و MySQL و SQLite3.
الموقع والوثائق. يتم استضافة المشروع على Github ، ولديه مجموعة اختبار شاملة.
يهدف Bookshelf إلى توفير مكتبة بسيطة للمهام الشائعة عند الاستعلام عن قواعد البيانات في JavaScript ، وتشكيل العلاقات بين هذه الكائنات ، مع أخذ الكثير من الأفكار من نمط Mapper Data.
من خلال قاعدة كود مختصرة ومتعلمية ، فإن رف الكتب سهل القراءة والفهم والتمديد. لا يجبرك على استخدام أي مخطط للتحقق من الصحة ، ويوفر علاقة مرنة وفعالة/تحميل متداخلة ودعم معاملات من الدرجة الأولى.
إنه خريطة عقلانية لعلاق الكائنات ، مما يتيح لك الانزلاق إلى واجهة Knex الخام كلما احتجت إلى استعلام مخصص لا يتناسب تمامًا مع اتفاقيات الأسهم.
ستحتاج إلى تثبيت نسخة من Knex ، وإما mysql
أو pg
أو sqlite3
من NPM.
$ 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 الأصلية.هل لديك أسئلة حول المكتبة؟ تعال وانضم إلينا في قناة #Bookshelf FreeNode IRC للحصول على دعم على Knex.js و Bookshelf.js ، أو نشر مشكلة على Stack Overflow.
إذا كنت ترغب في المساهمة في رف الكتب ، فستحتاج عادةً إلى الإبلاغ عن مشكلة أو إرسال طلب سحب. لهذا الغرض ، يتوفر مستودع الإنترنت على GitHub.
لمزيد من المساعدة في إعداد بيئة التطوير المحلية أو تعلم كيف يمكنك المساهمة في رف الكتب ، يجب عليك قراءة المستند المساهم المتاح على Github.
نعم ، يمكنك الاتصال .asCallback(function(err, resp) {
على أي طريقة تشغيل قاعدة بيانات واستخدام واجهة رد الاتصال القياسية (err, result)
إذا كنت تفضل ذلك.
تأكد من التحقق من أن النوع صحيح بالنسبة للمعلمات الأولية التي يتم تمريرها إلى النموذج الأولي الذي يتم جلبه. على سبيل المثال ، لن يعيد new Model({id: '1'}).load([relations...])
نفس new Model({id: 1}).load([relations...])
- إشعار أن المعرف هو سلسلة في حالة واحدة ورقم في الآخر. يمكن أن يكون هذا خطأ شائعًا إذا استرجع المعرف من معلمة عنوان URL.
هذه ليست سوى مشكلة إذا كنت تتوق إلى تحميل بيانات التحميل دون جلب النموذج الأصلي أولاً. new Model({id: '1'}).fetch({withRelated: [relations...]})
المشكلة هنا هي أن Knex ، طبقة تجريد قاعدة البيانات المستخدمة من قبل رف الكتب ، تستخدم تجميع الاتصال ، وبالتالي تبقي اتصال قاعدة البيانات مفتوحًا. إذا كنت تريد أن تخرج العملية الخاصة بك بعد انتهاء البرنامج النصي الخاص بك ، فسيتعين عليك الاتصال .destroy(cb)
على خاصية knex
لمثيل Bookshelf
الخاص بك أو على مثيل Knex
الذي تم تمريره أثناء التهيئة. يمكن العثور على مزيد من المعلومات حول تجميع الاتصال في مستندات Knex.
إذا قمت بتمرير debug: true
في كائن الخيارات لتهيئة مكالمة knex
، يمكنك رؤية جميع مكالمات الاستعلام التي يتم إجراؤها. يمكنك أيضًا نقل هذا الخيار نفسه إلى جميع الطرق التي تصل إلى قاعدة البيانات ، مثل 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 => {
// ...
} )
في بعض الأحيان تحتاج إلى الغوص قليلاً في المكالمات المختلفة ومعرفة ما يجري كل شيء وراء الكواليس. يمكنك استخدام Prospector Node ، والذي يتيح لك تصحيح رمز مع بيانات debugger
كما تفعل في المتصفح.
يستخدم Bookshelf نسخته الخاصة من مكتبة bluebird
Promish. يمكنك القراءة هنا لمزيد من الوعود على الوعود.
إن إضافة الكتلة التالية في بداية رمز التطبيق الخاص بك سوف يلتقط أي أخطاء لا يتم اكتشافها في معالجات سلسلة الوعد العادية ، وهو أمر مفيد للغاية في تصحيح الأخطاء:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
انظر الوثيقة المساهمة على جيثب.
على الرغم من أنه يستهدف في المقام الأول node.js ، فإن جميع التبعيات متوافقة مع المتصفح ، ويمكن تكييفها للعمل مع بيئات JavaScript الأخرى التي تدعم قاعدة بيانات SQLite3 ، من خلال توفير محول Knex مخصص. لا يوجد مثل هذا المحول.
وجدنا المشاريع التالية باستخدام رف الكتب ، ولكن يمكن أن يكون هناك المزيد: