简体   繁体   English

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

[英]node.js + postgres: Syntax error at or near “$1”

I am having trouble understanding the npm package pg and its "dynamic statements". 我无法理解npm包pg及其“动态语句”。

I want to be able to generate INSERT INTO statements but I only get syntax error in return 我希望能够生成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();
  });
});

The error I get is: 我得到的错误是:

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

Can anybody help me to understand what I'm doing wrong? 任何人都可以帮我理解我做错了什么吗?

Databases generally don't let you use placeholders for identifiers (table names, column names, ...). 数据库通常不允许您使用占位符作为标识符(表名,列名,...)。 PostgreSQL is complaining because you're trying to use the first three placeholders as column names: PostgreSQL抱怨,因为你试图使用前三个占位符作为列名:

INSERT INTO users($1, $2, $3) ...

You can think of identifiers like variable names in JavaScript: you can't put a variable name into another variable without some sort of eval chicanery. 您可以在JavaScript中考虑变量名称之类的标识符:如果没有某种eval chicanry,您不能将变量名称放入另一个变量中。 Similarly, you can't put a column name in a placeholder. 同样,您不能将列名放在占位符中。

You should specify the column names without placeholders: 您应该指定没有占位符的列名:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM