Bookshelf es un JavaScript ORM para Node.js, construido en el Knex SQL Consulter Builder. Cuenta con interfaces de devolución de llamada basadas en la promesa, soporte de transacciones, carga de relación ansiosa/anidada, asociaciones polimórficas y apoyo para relaciones individuales, de uno a muchos y muchas a muchos.
Está diseñado para funcionar con PostgreSQL, MySQL y SQLite3.
Sitio web y documentación. El proyecto está alojado en GitHub y tiene una suite de prueba integral.
Bookshelf tiene como objetivo proporcionar una biblioteca simple para tareas comunes al consultar bases de datos en JavaScript y formar relaciones entre estos objetos, tomando muchas ideas del patrón de mapeadores de datos.
Con una base de código conciso y alfabetizada, la estantería es fácil de leer, comprender y extender. No le obliga a usar ningún esquema de validación específico y proporciona una relación flexible y eficiente/carga de relación anidada y soporte de transacciones de primera clase.
Es un mapeador relacional de objetos delgados, lo que le permite caer a la interfaz Knex RAW siempre que necesite una consulta personalizada que no se ajuste con las convenciones de stock.
Deberá instalar una copia de Knex, y mysql
, pg
o sqlite3
desde NPM.
$ npm install knex
$ npm install bookshelf
# Then add one of the following :
$ npm install pg
$ npm install mysql
$ npm install sqlite3
La biblioteca de estantería se inicializa pasando una instancia inicializada del cliente KNEX. La documentación de KNEX proporciona una serie de ejemplos para diferentes bases de datos.
// 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'
} )
Es probable que esta inicialización solo suceda una vez en su aplicación. Como crea un grupo de conexión para la base de datos actual, debe usar la instancia bookshelf
devuelta en toda su biblioteca. Deberá almacenar esta instancia creada por la inicializar en algún lugar de la aplicación para que pueda hacer referencia a ella. Un patrón común a seguir es inicializar al cliente en un módulo para que pueda hacer referencia fácilmente a él más tarde:
// 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' , {
// ...
} )
Aquí hay un ejemplo para comenzar:
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()
en un modelo. Model
, agregar marcas de tiempo, validación de atributos y algunos métodos Nation CRUD.¿Tienes preguntas sobre la biblioteca? Únase a nosotros en el canal #bookshelf FreeNode IRC para obtener soporte en Knex.js y Bookshelf.js, o publique un problema en Stack Overflow.
Si desea contribuir a Bookshelf, generalmente querrá informar un problema o enviar una solicitud de extracción. Para este propósito, el repositorio en línea está disponible en GitHub.
Para obtener más ayuda para configurar su entorno de desarrollo local o aprender cómo puede contribuir a la estantería, debe leer el documento contribuyente disponible en GitHub.
Sí, puede llamar a .asCallback(function(err, resp) {
en cualquier método de operación de la base de datos y usar la interfaz de devolución de llamada de estilo estándar (err, result)
si lo prefiere.
Asegúrese de verificar que el tipo sea correcto para los parámetros iniciales pasados al modelo inicial que se obtiene. Por ejemplo new Model({id: '1'}).load([relations...])
no devolverá lo mismo que new Model({id: 1}).load([relations...])
- Aviso que la ID es una cadena en un caso y un número en el otro. Este puede ser un error común si recuperar la ID de un parámetro URL.
Esto es solo un problema si está ansioso por cargar datos con carga sin obtener primero el modelo original. new Model({id: '1'}).fetch({withRelated: [relations...]})
debería funcionar bien.
El problema aquí es que Knex, la capa de abstracción de la base de datos utilizada por la estantería, utiliza la agrupación de conexión y, por lo tanto, mantiene la conexión de la base de datos abierta. Si desea que su proceso salga después de que su script haya terminado, deberá llamar a .destroy(cb)
en la propiedad knex
de su instancia Bookshelf
o en la instancia Knex
aprobada durante la inicialización. Se puede encontrar más información sobre la agrupación de conexión en los documentos de Knex.
Si aprueba debug: true
en el objeto de opciones a su llamada de inicialización knex
, puede ver todas las llamadas de consulta que se realizan. También puede pasar esa misma opción a todos los métodos que acceden a la base de datos, como model.fetch()
o model.destroy()
. Ejemplos:
// 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 => {
// ...
} )
A veces debe sumergirse un poco más en las diversas llamadas y ver qué está sucediendo todo detrás de escena. Puede usar Node-Inspector, que le permite depurar el código con declaraciones debugger
como lo haría en el navegador.
Bookshelf utiliza su propia copia de la Biblioteca bluebird
Promise. Puede leer aquí para obtener más información sobre las promesas de depuración.
Agregar el siguiente bloque al comienzo de su código de aplicación captará cualquier error que no se haya capturado en los manejadores de la cadena de promesas normales, lo cual es muy útil en la depuración:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
Vea el documento contribuyente sobre GitHub.
Si bien se dirige principalmente a Node.js, todas las dependencias son compatibles con el navegador, y podría adaptarse para funcionar con otros entornos de JavaScript que admiten una base de datos SQLITE3, proporcionando un adaptador KNEX personalizado. Sin embargo, no existe tal adaptador.
Encontramos los siguientes proyectos usando estantería, pero puede haber más: