gpt4 book ai didi

objection.js - 为 objection.js 进行的所有查询打印完整的 SQL

转载 作者:行者123 更新时间:2023-12-04 04:29:39 26 4
gpt4 key购买 nike

我正在寻找一种方法来捕获 Objection.js 的所有查询的原始 SQL。库使用插入到 SQL 字符串中的绑定(bind)执行。
我意识到有一个 Knex event handler我可以利用 on('query', data) 的第二个参数是一个包含单独绑定(bind)的 SQL 模板的对象。
例如

{
sql: "select \"accounts\".* from \"accounts\" where \"id\" = ?",
bindings: [1]
}
我想知道最优雅的方法是否是使用 .toString() 之类的东西。 QueryBuilder 上存在的方法,但我认为回调中没有 QueryBuilder 的特定实例。理想情况下,我不会重新发明轮子并重新编写 Knex 的插值方法。
任何指针将不胜感激。
谢谢!

最佳答案

您可以使用 .toKnexQuery() function拉出底层 knex 查询生成器并获得对 .toSQL() 的访问权限和 .toQuery() .
我使用第 2 版 Objection 测试并验证了以下示例。我找不到 .toKnexQuery()version 1 docs因此无法验证它是否适用于早期版本的异议。

// Users.js
const { Model } = require('objection')

class Users extends Model {
static get tableName() { return 'users' }
// Insert jsonSchema, relationMappings, etc. here
}

module.exports = Users
const Users = require('./path/to/Users')

const builder = Users.query()
.findById(1)
.toKnexQuery()

console.log(builder.toQuery())
// "select `users`.* from `users` where `users`.`id` = 1"

console.log(builder.toSQL())
// {
// method: 'select',
// bindings: [ 1 ],
// sql: 'select `users`.* from `users` where `users`.`id` = ?'
// }

可能应该重申的是,除了 .toString() , .toQuery()也容易受到 SQL 注入(inject)攻击(参见 here)。
修改查询的更“负责任”的方式可能是这样的(使用 MySQL):
const { sql, bindings } = Users.query()
.insert({ id: 1 })
.toKnexQuery()
.toSQL()
.toNative()

Users.knex().raw(`${sql} ON DUPLICATE KEY UPDATE foo = ?`, [...bindings, 'bar'])

关于objection.js - 为 objection.js 进行的所有查询打印完整的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63045385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com