准备 pg 查询的正确方法

Correct Way To Prepare pg Query

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

syntax error at or near "VALUES", or "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(, , , , , , )';
        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);
            })
    });
}
}

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

UPDATE users 
SET
  username = , 
  dob = , 
  country = , 
  province = , 
  city = , 
  date = 
WHERE 
  user_id = 

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

  1. 对于更新某些记录,您必须具有索引标识列[s] 才能使用其搜索现有行:
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. 当您的 table 有限制时,您必须在更新前禁用它并在所有更新结束后打开它:
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;