有人知道使用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();
您可以构建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 query
、query.then(rows => {})
或query.asCallback( (err,rows)=>{} )
,您就在等待数据库结果、启动承诺链或定义回调。那就是数据库被击中的时候。
初始化时打开debug: true
,只会在query.toSQL()
的结果针对实际DB运行时将其写入控制台。有时一个应用程序可能会进行大量查询,如果其中一个出现错误,这是一种查看DB调用失败原因的方法(但非常详细,因此通常不会一直打开)。
在我们的应用程序测试中,我们实际上是针对数据库进行测试的,因为这种类型的单元测试非常混乱。我们在测试数据库上使用knex的迁移,每次运行测试时都会启动测试数据库。因此,它总是开始清理(或使用已知的种子数据),如果测试失败,DB将处于相同的状态,需要手动检查。虽然我们在测试运行中创建了大量测试数据,但在下一次测试之前会对其进行清理。