我正在使用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)
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在这种情况下使用了拉斐尔提到的。
| 归档时间: |
|
| 查看次数: |
4167 次 |
| 最近记录: |