Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js+;postgres:在“或”附近出现语法错误$1“;_Node.js_Postgresql - Fatal编程技术网

node.js+;postgres:在“或”附近出现语法错误$1“;

node.js+;postgres:在“或”附近出现语法错误$1“;,node.js,postgresql,Node.js,Postgresql,我很难理解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 que

我很难理解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();
  });
});
我得到的错误是:

{ [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' }

有人能帮我理解我做错了什么吗?

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

INSERT INTO users($1, $2, $3) ...
您可以想象JavaScript中的标识符类似于变量名:如果没有某种
eval
诡计,就无法将变量名放入另一个变量中。同样,您不能将列名放在占位符中

应指定不带占位符的列名:

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

Cewl,我想是这样的。Thx mu!这是否意味着以下查询也无效?”更新$1集合$2=$3,其中$4=$5',[rec.tablename,rec.cell_d,rec.cell_v,rec.WHERE_d,rec.WHERE_v]@KentWong是的,您不能对标识符使用占位符(即表名、列名等),占位符只对值起作用。因此,
$1
$2
$4
在那里不起作用。好吧,但是如果您需要表名是动态的,该怎么办?@U2ros那么您就只能进行字符串操作了。数据库接口应该有一个引用/转义标识符的方法,您可以使用该方法使动态表名安全,或者您可以将表名列入白名单,以便只允许已知的安全值。