在“ $ 1”或附近出现带有原始SQL throw语法错误的数据时出错

时间:2018-12-06 04:05:58

标签: knex.js

这是我的代码:

import { knex } from '../db-local';

async function createUserRaw(user) {
  const cols = Object.keys(user);
  const values = cols.map(col => user[col]);
  const sql = `
    insert into users (${cols.map(_ => '?').join(',')})
    values
      (${values.map(_ => '?').join(',')})
    on conflict do nothing;
  `;

  return knex.raw(sql, cols.concat(values));
}

export { createUserRaw };

当我尝试创建用户时:

const user = { user_id: 4, user_name: faker.name.findName() };

遇到此错误:

  

错误:“ $ 1”或附近的语法错误

这是knex.js发出的调试消息:

{ method: 'raw',
      sql: '\n    insert into users (?,?)\n    values\n      (?,?)\n  ',
      bindings: [ 'user_id', 'user_name', 4, 'Margaret Daniel' ],
      options: {},
      __knexQueryUid: '75603cf6-3ea1-4481-8412-ed3f707c5a60' }  

我不知道哪里出了问题。

1 个答案:

答案 0 :(得分:0)

值绑定?不能用于传递列名(至少在postgresql中)。您需要使用??绑定来传递标识符,这会在标识符周围添加正确的引号。

insert into users (${cols.map(_ => '?').join(',')})

应该是:

insert into users (${cols.map(_ => '??').join(',')})

,然后您生成的SQL将更改为:

{ method: 'raw',
      sql: '\n    insert into users ("user_id", "user_name")\n    values\n      (?,?)\n  ',
      bindings: [ 4, 'Margaret Daniel' ],
      ...}

哪个是有效的SQL