Bookshelf est un orm JavaScript pour Node.js, construit sur le générateur de requête Knex SQL. Il propose des interfaces de rappel à la fois basées sur les promesses et traditionnelles, un support de transaction, un chargement de relations impatients / imbriquées, des associations polymorphes et un support pour les relations individuelles, un à plusieurs et plusieurs à plusieurs.
Il est conçu pour fonctionner avec PostgreSQL, MySQL et SQLite3.
Site Web et documentation. Le projet est hébergé sur GitHub et dispose d'une suite de test complète.
La bibliothèque vise à fournir une bibliothèque simple pour les tâches courantes lors de l'interrogation de bases de données en JavaScript et de la formation de relations entre ces objets, en prenant beaucoup d'idées du modèle de mappeur de données.
Avec une base de code concise et alphabétisée, la bibliothèque est simple à lire, à comprendre et à étendre. Il ne vous oblige pas à utiliser un schéma de validation spécifique et fournit un chargement flexible et efficace de relation de relation / relation imbriquée et un support de transaction de première classe.
C'est un mappeur d'objet maigre, vous permettant de descendre à l'interface Knex brute chaque fois que vous avez besoin d'une requête personnalisée qui ne correspond pas tout à fait aux conventions de stock.
Vous devrez installer une copie de Knex, et mysql
, pg
ou sqlite3
de NPM.
$ npm install knex
$ npm install bookshelf
# Then add one of the following :
$ npm install pg
$ npm install mysql
$ npm install sqlite3
La bibliothèque de la bibliothèque est initialisée en passant une instance de client Knex initialisée. La documentation Knex fournit un certain nombre d'exemples pour différentes bases de données.
// 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'
} )
Cette initialisation ne devrait probablement se produire qu'une seule fois dans votre application. Comme il crée un pool de connexion pour la base de données actuelle, vous devez utiliser l'instance bookshelf
renvoyée dans votre bibliothèque. Vous devrez stocker cette instance créée par l'initialisation quelque part dans l'application afin que vous puissiez la référencer. Un modèle commun à suivre est d'initialiser le client dans un module afin que vous puissiez facilement le référencer plus tard:
// 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' , {
// ...
} )
Voici un exemple pour vous aider à démarrer:
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()
sur un modèle. Model
, en ajoutant des horodatages, une validation d'attribut et certaines méthodes CRUD natives.Vous avez des questions sur la bibliothèque? Venez vous joindre à nous dans le canal IRC #Bookshelf Freenode pour la prise en charge sur Knex.js et Bixhelf.js, ou publiez un problème sur Stack Overflow.
Si vous souhaitez contribuer à la bibliothèque, vous voudrez généralement signaler un problème ou soumettre une requête de traction. À cette fin, le référentiel en ligne est disponible sur GitHub.
Pour plus d'aide pour mettre en place votre environnement de développement local ou apprendre comment vous pouvez contribuer à la bibliothèque, vous devez lire le document contributif disponible sur GitHub.
Oui, vous pouvez appeler .asCallback(function(err, resp) {
sur n'importe quelle méthode de fonctionnement de la base de données et utiliser l'interface de rappel de style standard (err, result)
si vous préférez.
Assurez-vous de vérifier que le type est correct pour les paramètres initiaux transmis au modèle initial récupéré. Par exemple new Model({id: '1'}).load([relations...])
ne renverra pas la même chose que new Model({id: 1}).load([relations...])
- Remarque que l'ID est une chaîne dans un cas et un nombre dans l'autre. Cela peut être une erreur courante si la récupération de l'ID à partir d'un paramètre URL.
Ce n'est qu'un problème si vous êtes impatient de charger des données avec une charge sans d'abord récupérer le modèle d'origine. new Model({id: '1'}).fetch({withRelated: [relations...]})
devrait très bien fonctionner.
Le problème ici est que Knex, la couche d'abstraction de la base de données utilisée par la bibliothèque, utilise la pool de connexions et maintient ainsi la connexion de la base de données ouverte. Si vous souhaitez que votre processus quitte une fois votre script terminé, vous devrez appeler .destroy(cb)
sur la propriété knex
de votre instance Bookshelf
ou sur l'instance Knex
transmise lors de l'initialisation. Plus d'informations sur la regroupement de connexions peuvent être trouvées sur les documents Knex.
Si vous passez debug: true
dans l'objet Options à votre appel knex
Initialize, vous pouvez voir tous les appels de requête en cours. Vous pouvez également transmettre la même option à toutes les méthodes qui accèdent à la base de données, comme model.fetch()
ou model.destroy()
. Exemples:
// 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 => {
// ...
} )
Parfois, vous devez plonger un peu plus loin dans les différents appels et voir ce qui se passe dans les coulisses. Vous pouvez utiliser Node-inspecteur, qui vous permet de déboguer du code avec des instructions debugger
comme vous le feriez dans le navigateur.
Bookshelf utilise sa propre copie de la bibliothèque bluebird
Promise. Vous pouvez lire ici pour en savoir plus sur les promesses de débogage.
L'ajout du bloc suivant au début de votre code d'application attrapera toutes les erreurs non autrement prises dans les gestionnaires de chaîne de promesses normales, ce qui est très utile pour le débogage:
process . stderr . on ( 'data' , ( data ) => {
console . log ( data )
} )
Voir le document contribuant sur GitHub.
Bien qu'il cible principalement Node.js, toutes les dépendances sont compatibles avec le navigateur, et il pourrait être adapté pour fonctionner avec d'autres environnements JavaScript prenant en charge une base de données SQLite3, en fournissant un adaptateur Knex personnalisé. Il n'y a cependant aucun adaptateur.
Nous avons trouvé les projets suivants utilisant la bibliothèque, mais il peut y en avoir plus: