【问题标题】:Can I chain a Knex Raw command?我可以链接 Knex Raw 命令吗?
【发布时间】:2019-05-03 12:42:51
【问题描述】:

我正在使用 knex.raw 在 Postgres ON CONFLICT 中插入行...我想像 batchInsert 一样插入多行。如何链接原始语句? TypeScript 界面提示你不能。

我当前的实现使用了 forEach + await (promise),这显然是在进行远程多次调用。

const data = [
  { ref : 'A', name : 'My A' },
  { ref : 'B', name : 'My B' },
  { ref : 'C', name : 'My C' }
];

await items.forEach(async (item) => {
    const insert = trx.table('myTable').insert({'ref': item.ref, 'name' : item.name}).toSQL();
    const onConflict = 'ON CONFLICT ON CONSTRAINT myTable_pkey DO NOTHING';
    await trx.raw(`${insert.sql} ${onConflict}`, insert.bindings);
}

【问题讨论】:

    标签: knex.js


    【解决方案1】:

    不,您不能链接原始查询...每个原始查询都是一个查询。但是你想通过链接来实现什么样的查询?为什么你不能这样做:

    const insert = trx.table('myTable').insert(items).toSQL();
    const onConflict = 'ON CONFLICT ON CONSTRAINT myTable_pkey DO NOTHING';
    await trx.raw(`${insert.sql} ${onConflict}`, insert.bindings);
    

    【讨论】:

    • 我正在尝试执行 batchInsert 但插入的每一行都使用“ON CONFLICT”。在对 knex 代码库进行了进一步研究之后,看来 batchInsert 只是包装在事务中的并行异步插入,而不是我想要实现的单个 db 调用。有很多关于在一次调用中运行多个语句的讨论,但看起来这种支持不会很快到来。
    • 你知道这种查询是否可以用 postgresql 来完成?你到底想通过什么来实现? AFAIK 我在这里所做的方式分别对每一行发生冲突,因此如果发生冲突行,则忽略该行并添加其余行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多