如何调试knex.js?不必污染我的数据库

How to debug knex.js? Without having to pollute my db

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

我在他们的文档中找不到任何有用的东西。他们提到传递 {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();

您可以构建 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 的迁移,每次测试 运行 时都会关闭和启动该数据库。所以它总是以干净的方式开始(或使用已知的种子数据),如果测试失败,数据库将处于相同的状态以供手动检查。虽然我们在测试 运行 中创建了大量测试数据,但在下一次测试之前会对其进行清理。