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

Osu*_*iel 2 mysql node.js knex.js

有谁知道有关使用 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();
Run Code Online (Sandbox Code Playgroud)

cla*_*lay 6

您可以构建 knex 查询,但在附加.then()or awiat()(或 run . 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'
Run Code Online (Sandbox Code Playgroud)

这不会影响数据库,并且是同步的。你想要多少就制作多少!

一旦您这样做await query或正在等待数据库结果,就启动承诺链query.then(rows => {})query.asCallback( (err,rows)=>{} )定义回调。那就是数据库受到攻击的时候。

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

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