Como posso ver o SQL gerado pelo Sequelize.js?

98

Quero ver os comandos SQL enviados ao servidor PostgreSQL porque preciso verificar se estão corretos. Em particular, estou interessado nos comandos de criação de tabelas.

Por exemplo, ActiveRecord (Ruby) imprime suas instruções SQL na saída padrão. Isso também é possível com Node.js / ActionHero.js e Sequelize.js?

boxeador de ideias
fonte

Respostas:

154

Você pode passar uma opção de registro ao inicializar o sequelize, que pode ser uma função ou console.log

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

Você também pode passar uma opção de registro para .sync se quiser apenas ver as consultas de criação de tabela

sequelize.sync({ logging: console.log })
Jan Aagaard Meier
fonte
Obrigado, é exatamente isso que eu quero. DEPRECATION WARNING: The logging-option should be either a function or false. Default: console.log-- O que isto significa?
ideaboxer
Significa que você deve passar uma função em vez de true.
Mick Hansen
5
Eu nunca passei true.
ideaboxer
1
Estou um pouco atrasado para a festa, mas console.logfunciona de maneiras misteriosas. Você deve ser capaz de evitar a mensagem de log usando { logging: (msg) => console.log(msg) }ou { logging: function(msg) { console.log(msg) } }. (não testado, então eu posso estar totalmente errado)
3oceno
1
Existe alguma maneira de ver a consulta gerada, mas a consulta não deve ser executada?
NIKHIL CM de
37

Conforme indicado no log Error: Please note that find* was refactored and uses only one options object from now on.. Para a última versão sequelize (4), se você quiser ter o resultado para apenas um comando:

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

Adlen Afane
fonte
1
isso também funciona com consultas nativas:query(statement, { replacements: { userId: userId, superiorPositions: [ 4, 5, 7 ], departments: [ departmentId ] }, logging: console.log });
Christian Noel
1
esta é a resposta correta para onde o registro: console.log deve ser colocado, na sequência 4.
user627119
30

Se você quiser ver a sequência de um comando, você pode ouvi-lo e anexar uma função para imprimir o sql.

Veja este exemplo:

User.find(1).on('sql', console.log).then(function(user) {
  // do whatever you want with the user here
vpontis
fonte
38
Agora você passa um registrador como uma opção para registrar uma única declaração:User.find(1, { logging: console.log })
Stephen Watkins
4
O meu apenas diz <functionName>.findOne(...).on is not a function Using sequelize 3.30.4
ginna
1
Parece que alguns dos mixins de associação não suportam a opção de registro. Especificamente, o get*na origem de um relacionamento belongsTo.
Tom,
2

Você também pode tirar proveito do uso do módulo Debug pelo Sequelize, configurando seu ambiente, desta forma: DEBUG=sequelize:sql* antes de iniciar seu aplicativo.

Steev
fonte
1
esta deve ser uma resposta! Obrigado pela dica!
confiq