node.js + postgres:"$ 1"或附近的语法错误

mra*_*xus 4 postgresql node.js

我无法理解npm包pg及其"动态语句".

我希望能够生成INSERT INTO语句,但我只得到语法错误

var pg = require('pg');
var connectionString = 'postgres://postgres@localhost/db';

pg.connect(connectionString, function(err, client, done) {
  if (err) { return console.error(err); }

  var queryConfig = {
    text: 'INSERT INTO users($1, $2, $3) VALUES($4, $5, $6);',
    values: ['username', 'firstname', 'lastname', 'ab', 'A', 'B']
  };

  client.query(queryConfig, function (err, result) {
    if (err) { return console.error(err); }
    done();
  });
});
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

{ [error: syntax error at or near "$1"]
  name: 'error',
  length: 84,
  severity: 'ERROR',
  code: '42601',
  detail: undefined,
  hint: undefined,
  position: '19',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  file: 'scan.l',
  line: '1053',
  routine: 'scanner_yyerror' }
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我理解我做错了什么吗?

mu *_*ort 11

数据库通常不允许您使用占位符作为标识符(表名,列名,...).PostgreSQL抱怨,因为你试图使用前三个占位符作为列名:

INSERT INTO users($1, $2, $3) ...
Run Code Online (Sandbox Code Playgroud)

您可以在JavaScript中考虑变量名称之类的标识符:如果没有某种类型的evalchicanery,您不能将变量名称放入另一个变量中.同样,您不能将列名放在占位符中.

您应该指定没有占位符的列名:

var queryConfig = {
  text: 'INSERT INTO users(username, firstname, lastname) VALUES($1, $2, $3);',
  values: ['ab', 'A', 'B']
};
Run Code Online (Sandbox Code Playgroud)

  • @KentWong是的,您不能使用占位符作为标识符(即表名,列名,...),占位符仅适用于值。所以 `$1`、`$2` 和 `$4` 在那里不起作用。 (3认同)
  • 好的,但是如果您需要表名是动态的怎么办? (2认同)