【问题标题】:How to debug knex.js? Without having to pollute my db如何调试 knex.js?无需污染我的数据库
【发布时间】:2019-01-31 05:22:31
【问题描述】:

有谁知道使用 knexjs 和 mysql 进行调试吗?我正在尝试做很多事情并测试一些东西,并且我一直在用随机数据污染我的测试数据库。理想情况下,我只想做一些事情并查看输出查询是什么,而不是针对实际数据库运行它以查看它是否真的有效。

我在他们的文档中找不到任何有用的东西。他们提到传递 {debug: true} 作为初始化设置中的选项之一,但它并没有真正解释它的作用。

我是一名初级开发人员,所以也许其中一些内容不应该被初级开发人员理解,但归根结底我根本不清楚我应该采取哪些步骤才能看到查询会产生什么运行而不是运行真正的查询并污染我的数据库。

const result = await db().transaction(trx =>
    trx.insert(mapToSnakeCase(address), 'id').into('addresses')
      .then(addressId =>
        trx.insert({ addresses_id: addressId, display_name: displayName }, 'id')
          .into('chains')).toString();

【问题讨论】:

标签: mysql node.js knex.js


【解决方案1】:

您可以构建 knex 查询,但在您附加 .then()awiat()(或运行 . asCallback((error,cb)=>{}))之前,查询只是一个对象。

所以你可以这样做

let localVar = 8
let query = knex('table-a').select().where('id', localVar)
console.log(query.toString())
// outputs a string 'select * from table-a where id = 8'

这不会命中数据库,并且是同步的。随心所欲地制作这些!

只要您执行await queryquery.then(rows => {})query.asCallback( (err,rows)=>{} ),您就在等待数据库结果、启动承诺链或定义回调。那是数据库被击中的时候。

在初始化时打开debug: true 只会将query.toSQL() 的结果写入控制台,因为它们针对实际数据库运行。有时,应用可能会进行大量查询,如果出现问题,这是一种查看数据库调用失败原因的方法(但非常冗长,因此通常不会一直开启)。

在我们的应用程序测试中,我们实际上是针对数据库进行测试,因为对这类东西进行单元测试是一团糟。我们在每次测试运行时都会关闭和启动的测试数据库上使用 knex 的迁移。因此它总是以干净的方式开始(或使用已知的种子数据),如果测试失败,则数据库处于相同状态以进行手动检查。虽然我们在测试运行中创建了大量测试数据,但在下一次测试之前会对其进行清理。

【讨论】:

    猜你喜欢
    • 2019-10-15
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    相关资源
    最近更新 更多