Книжная полка - это JavaScript ORM для node.js, построенный на строительном застройке Knex SQL. Он включает как на основе обещаний, так и традиционные интерфейсы обратного вызова, поддержка транзакций, страстное/вложенное отношение, полиморфные ассоциации, а также поддержку отношений от один-одно, один-один и многие ко многим.
Он предназначен для работы с PostgreSQL, MySQL и SQLite3.
Веб -сайт и документация. Проект размещен на GitHub и имеет комплексный набор тестов.
Книжная полка направлена на то, чтобы предоставить простую библиотеку для общих задач при запросе баз данных в JavaScript и формирование отношений между этими объектами, взяв множество идей из шаблона Mapper Data.
С краткой грамотной кодовой базой книжная полка проста в чтении, понимании и расширении. Он не заставляет вас использовать какую-либо конкретную схему проверки и обеспечивает гибкую, эффективную нагрузку/нагрузку в зависимости от отношения и поддержание первоклассных транзакций.
Это худой объект-реламентальный Mapper, который позволяет вам упасть до необработанного интерфейса 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 и Booksemff.JS, или опубликуйте проблему переполнения стека.
Если вы хотите внести свой вклад в книжную полку, вы обычно захотите сообщить о проблеме или отправить запрос. Для этого онлайн -репозиторий доступен на 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, уровень абстракции базы данных, используемый Book Sheels, использует объединение соединений и, таким образом, сохраняет соединение базы данных открытым. Если вы хотите, чтобы ваш процесс вышел после завершения вашего скрипта, вам придется позвонить .destroy(cb)
на свойство knex
вашей экземпляры Bookshelf
или на экземпляре Knex
, передаваемом во время инициализации. Более подробную информацию о объединении соединений можно найти в документах KNEX.
Если вы передаете debug: true
в объекте Options в вашем вызове 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 => {
// ...
} )
Иногда вам нужно немного погрузиться в различные звонки и посмотреть, что все происходит за кулисами. Вы можете использовать Node-Incepper, который позволяет вам отлаживать код с помощью заявлений debugger
как вы бы в браузере.
Книжная полка использует свою собственную копию библиотеки обещаний bluebird
. Вы можете прочитать здесь для получения дополнительной информации о обещаниях отладки.
Добавление следующего блока в начале кода вашего приложения поймает любые ошибки, не попавшие в обычные обработки цепочек обещаний, что очень полезно при отладке:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
Смотрите документ, способствующий Github.
Несмотря на то, что он в основном нацелен на node.js, все зависимости совместимы с браузером, и он может быть адаптирован для работы с другими средами JavaScript, поддерживающими базу данных SQLite3, путем предоставления пользовательского адаптера Knex. Такого адаптера не существует, хотя.
Мы нашли следующие проекты, используя книжную полку, но может быть больше: