Comment puis-je voir le SQL généré par Sequelize.js?

98

Je veux voir les commandes SQL envoyées au serveur PostgreSQL car je dois vérifier si elles sont correctes. En particulier, je m'intéresse aux commandes de création de table.

Par exemple, ActiveRecord (Ruby) imprime ses instructions SQL sur la sortie standard. Est-ce possible avec Node.js / ActionHero.js et Sequelize.js?

ideaboxer
la source

Réponses:

154

Vous pouvez passer une option de journalisation lors de l'initialisation de sequelize, qui peut être une fonction ou une console.

var sequelize = new Sequelize('database', 'username', 'password', {
    logging: console.log
    logging: function (str) {
        // do your own logging
    }
});

Vous pouvez également transmettre une option de journalisation à .sync si vous souhaitez uniquement afficher les requêtes de création de table

sequelize.sync({ logging: console.log })
Jan Aagaard Meier
la source
Merci, c'est exactement ce que je veux. DEPRECATION WARNING: The logging-option should be either a function or false. Default: console.log-- Qu'est-ce que ça veut dire?
ideaboxer
Cela signifie que vous devez passer une fonction au lieu de true.
Mick Hansen
5
Je n'ai jamais passé true.
ideaboxer
1
Je suis un peu en retard à la fête, mais je console.logtravaille de manière mystérieuse. Vous devriez pouvoir éviter le message du journal en utilisant { logging: (msg) => console.log(msg) }ou { logging: function(msg) { console.log(msg) } }. (non testé donc je pourrais me tromper totalement)
3ocène
1
Existe-t-il un moyen de voir la requête générée, mais la requête ne doit pas s'exécuter?
NIKHIL CM
37

Comme indiqué dans le journal Error: Please note that find* was refactored and uses only one options object from now on.. Pour la dernière version de sequelize (4) si vous voulez avoir le résultat pour une seule commande:

User.findAll({where: {...}, logging: console.log})

Adlen Afane
la source
1
cela fonctionne également avec les requêtes natives:query(statement, { replacements: { userId: userId, superiorPositions: [ 4, 5, 7 ], departments: [ departmentId ] }, logging: console.log });
Christian Noel
1
c'est la bonne réponse pour l'emplacement de logging: console.log, dans sequelize 4.
user627119
30

Si vous voulez regarder la suite pour une commande, vous pouvez l'écouter et attacher une fonction à l'impression du sql.

Regardez cet exemple:

User.find(1).on('sql', console.log).then(function(user) {
  // do whatever you want with the user here
vpontis
la source
38
Vous passez maintenant dans un enregistreur comme une option pour enregistrer une seule déclaration:User.find(1, { logging: console.log })
Stephen Watkins
4
Le mien dit juste en <functionName>.findOne(...).on is not a function utilisant sequelize 3.30.4
ginna
1
Il semble que certains des mixins d'association ne prennent pas en charge l'option de journalisation. Plus précisément, le get*sur la source d'une relation appartient à.
Tom
3

Vous pouvez également profiter de l'utilisation par Sequelize du module Debug, en paramétrant votre environnement, ainsi: DEBUG=sequelize:sql* avant de démarrer votre application.

Steev
la source
1
cela devrait être une réponse! Merci pour le conseil!
confiq