【问题标题】:Correct Way To Prepare pg Query准备 pg 查询的正确方法
【发布时间】:2018-09-11 00:52:47
【问题描述】:

我一直在尝试为使用 Node js 和 npm 包 pg 的某些用户准备一个查询来更新我的表中的行。当我运行查询时出现问题,我的错误消息将返回错误:

“VALUES”或“WHERE”处或附近的语法错误

但从不提供更多关于错误的上下文,从而难以确定。我曾尝试重新排列值并尝试不同的方法,但均未成功。

populateProfileData(username, gender, dob, country, province, city, date, user_id) {
    console.log('================' + username + gender + dob + country + province + city + date + user_id);
    return new Promise(function (resolve, reject) {
        const client = new pg.Client(connectionString);
        client.connect()
            .then(() => console.log('connected'))
            .catch(err => console.error('connection error', err.stack))
        // This Works ---> UPDATE users SET dob = '032018' WHERE USER_id = 15
        const text = 'UPDATE users SET(username, dob, country, province, city, date)  WHERE user_id = (user_id) VALUES($1, $2, $3, $4, $5, $6, $7)';
        const values = [username, dob, country, province, city, date, user_id]
        const query = client.query(text, values)
            .then(success => {
                console.log('ran query')
                resolve(success);
            })
            .catch(error => {
                console.log('--------' + error)
                reject(error);
            })
    });
}
}

【问题讨论】:

  • 您的查询语法有问题,即WHERE user_id = (user_id) 不代表任何有意义的东西。

标签: node.js database postgresql pg


【解决方案1】:
  1. 对于 UPDATE 一些记录,您必须为标识列建立索引才能使用其搜索现有行:
INSERT INTO users (id, username, dob, country, province, city, date) 
VALUES 
  (1, 'Joe', 1, 'usa', 'utah', 'odessa', '12-21-2015'),
  (2, 'Doe', 2, 'usa', 'utah', 'odessa', '12-21-2015'),
  ...
ON CONFLICT (id)
DO UPDATE SET 
  username=EXCLUDED.username,
  dob=EXCLUDED.dob,
  country=EXCLUDED.country,
  province=EXCLUDED.province,
  city=EXCLUDED.city,
  date=EXCLUDED.date;
  1. 改为更新现有行,您可以忽略它:
INSERT INTO users (id, username, dob, country, province, city, date) 
VALUES 
  (1, 'Joe', 1, 'usa', 'utah', 'odessa', '12-21-2015'),
  (2, 'Doe', 2, 'usa', 'utah', 'odessa', '12-21-2015'),
  ...
ON CONFLICT (id) 
DO NOTHING
  1. 当您的表有约束时,您必须在更新前禁用它并在所有更新结束后打开:
ALTER "country" DROP NOT NULL;
INSERT INTO users (id, username, dob, country, province, city, date) 
VALUES 
  (1, 'Joe', 1, 'usa', 'utah', 'odessa', '12-21-2015'),
  (2, 'Doe', 2, 'usa', 'utah', 'odessa', '12-21-2015'),
  ...
ON CONFLICT (id)
DO UPDATE SET 
  username=EXCLUDED.username,
  dob=EXCLUDED.dob,
  country=EXCLUDED.country,
  province=EXCLUDED.province,
  city=EXCLUDED.city,
  date=EXCLUDED.date;
ALTER "country" SET NOT NULL;

【讨论】:

  • 这非常具有描述性并解决了我的问题,谢谢。
【解决方案2】:

不知道那个模块,但是更新语句的语法是这样的:

UPDATE users 
SET
  username = $1, 
  dob = $2, 
  country = $3, 
  province = $4, 
  city = $5, 
  date = $6
WHERE 
  user_id = $7

希望这能让您更接近工作代码

【讨论】:

  • 谢谢,我实际上能够考虑到您的回答并从客户端的 POST 更新数据库。我现在将推迟标记您的答案;原因是,我想看看如何在我的特定用例中使用 pg 模块执行此操作的正确方法,但仍然感谢您让我走上正确的轨道!
猜你喜欢
  • 2018-10-14
  • 1970-01-01
  • 2021-11-21
  • 2019-11-25
  • 2020-08-09
  • 2011-11-19
  • 2013-08-15
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多