这是我的代码:
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' }
我不知道哪里出了问题。
答案 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