如何在 Sequelize 中记录带有有界参数的查询?

Raf*_*sek 8 sequelize.js

我正在使用sequelize(版本5.3.5)连接到postgre数据库并已配置日志记录以使用console.log,但每当出现带有有限参数的查询时,我无法查看正在绑定哪些参数。

配置非常标准。

import Sequelize from 'sequelize';
let db = new Sequelize (
    "database", "username", "password",
    {
        dialect: 'postgres',
        logging: console.log
    }
);
Run Code Online (Sandbox Code Playgroud)

以 INSERT 操作的日志(在事务内)为例:

Executing (a7ed97b4-66a2-43a2-b4c5-eaa067e7ec28): INSERT INTO "Entities" ("id","type","createdAt","updatedAt") VALUES ($1,$2,$3,$4) RETURNING *;
Run Code Online (Sandbox Code Playgroud)

有没有办法让sequelize向我显示哪些值被映射到$1.. $6

Raf*_*sek 15

一段时间后我重新审视了这一点,并在版本中使用了sequelize,5.19.0我发现有一个属性存储了所有绑定值。

回到正题:

import Sequelize from 'sequelize';
let db = new Sequelize (
    "database", "username", "password",
    {
        dialect: 'postgres',
        logging: customLogger
    }
);


function customLogger ( queryString, queryObject ) {
    console.log( queryString )      // outputs a string
    console.log( queryObject.bind ) // outputs an array
}
Run Code Online (Sandbox Code Playgroud)


Cir*_*四事件 7

logQueryParameters: true

我们现在有这个选项可以做到这一点,用法:

  sequelize = new Sequelize({
    dialect: 'sqlite',
    storage: 'tmp.sqlite',
    logQueryParameters: true,
  })
Run Code Online (Sandbox Code Playgroud)

它输出类似:

Executing (default): INSERT INTO `IntegerNames` 
(`id`,`value`,`name`,`createdAt`,`updatedAt`) VALUES (NULL,$1,$2,$3,$4); 
{"$1":2,"$2":"two","$3":"2022-02-02 10:37:21.618 +00:00","$4":"2022-02-02 10:37:21.618 +00:00"}
Run Code Online (Sandbox Code Playgroud)

完整示例:

main.js

#!/usr/bin/env node
const assert = require('assert')
const path = require('path')
const { DataTypes, Sequelize } = require('sequelize')
let sequelize
if (process.argv[2] === 'p') {
  sequelize = new Sequelize('tmp', undefined, undefined, {
    dialect: 'postgres',
    host: '/var/run/postgresql',
    logQueryParameters: true,
  })
} else {
  sequelize = new Sequelize({
    dialect: 'sqlite',
    storage: 'tmp.sqlite',
    logQueryParameters: true,
  })
}
;(async () => {
const IntegerNames = sequelize.define('IntegerNames', {
  value: { type: DataTypes.INTEGER },
  name: { type: DataTypes.STRING },
});
await IntegerNames.sync({ force: true })
async function reset() {
  await sequelize.truncate({ cascade: true })
  await IntegerNames.create({ value: 2, name: 'two' })
  await IntegerNames.create({ value: 3, name: 'three' })
  await IntegerNames.create({ value: 5, name: 'five' })
}
await reset()
let rows
rows = await IntegerNames.findAll()
assert.strictEqual(rows[0].id, 1)
assert.strictEqual(rows[0].name, 'two')
assert.strictEqual(rows[0].value, 2)
assert.strictEqual(rows[1].id, 2)
assert.strictEqual(rows[1].name, 'three')
assert.strictEqual(rows[1].value, 3)
assert.strictEqual(rows[2].id, 3)
assert.strictEqual(rows[2].name, 'five')
assert.strictEqual(rows[2].value, 5)
assert.strictEqual(rows.length, 3)
})().finally(() => { return sequelize.close() })
Run Code Online (Sandbox Code Playgroud)

包.json

{
  "name": "tmp",
  "private": true,
  "version": "1.0.0",
  "dependencies": {
    "pg": "8.5.1",
    "pg-hstore": "2.3.3",
    "sequelize": "6.14.0",
    "sqlite3": "5.0.2"
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Executing (default): DROP TABLE IF EXISTS `IntegerNames`;
Executing (default): CREATE TABLE IF NOT EXISTS `IntegerNames` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `value` INTEGER, `name` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);
Executing (default): PRAGMA INDEX_LIST(`IntegerNames`)
Executing (default): DELETE FROM `IntegerNames`
Executing (default): INSERT INTO `IntegerNames` (`id`,`value`,`name`,`createdAt`,`updatedAt`) VALUES (NULL,$1,$2,$3,$4); {"$1":2,"$2":"two","$3":"2022-02-02 10:38:54.369 +00:00","$4":"2022-02-02 10:38:54.369 +00:00"}
Executing (default): INSERT INTO `IntegerNames` (`id`,`value`,`name`,`createdAt`,`updatedAt`) VALUES (NULL,$1,$2,$3,$4); {"$1":3,"$2":"three","$3":"2022-02-02 10:38:54.379 +00:00","$4":"2022-02-02 10:38:54.379 +00:00"}
Executing (default): INSERT INTO `IntegerNames` (`id`,`value`,`name`,`createdAt`,`updatedAt`) VALUES (NULL,$1,$2,$3,$4); {"$1":5,"$2":"five","$3":"2022-02-02 10:38:54.385 +00:00","$4":"2022-02-02 10:38:54.385 +00:00"}
Executing (default): SELECT `id`, `value`, `name`, `createdAt`, `updatedAt` FROM `IntegerNames` AS `IntegerNames`;
Run Code Online (Sandbox Code Playgroud)

测试了 PostgreSQL 13.5。

当我想缩进我的查询时,我无法使用它:How to indent/pretty print Logged Queries in Sequelize? 所以我只是queryObject.bind在这种情况下使用了拉斐尔提到的。