Несколько запросов в одном запросе - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь добавить новых пользователей в базу данных, и идентификатор автоматически повторяется. Я пытаюсь сделать это, сначала запустив запрос, чтобы проверить общее количество строк, а затем добавив к нему 1, чтобы назначить в качестве идентификатора пользователя, которого я хочу добавить.

One из проблем, с которыми я сталкиваюсь, является то, что в первом запросе присваивание newUser.id является областью действия блока, и я не могу получить доступ к этому значению вне его. Идентификатор для newUser остается нулевым или неопределенным в зависимости от того, как я перемещаю вещи

/add user to DB
router.post("/", (req, res) => {

var newID;

const newUser = {
    id: null,
    name: req.body.name,
    email: req.body.email,
    active: true
};

 db.result("SELECT COUNT(*) FROM users")
    .then(data => {
        newID = parseInt(data.rows[0].count) + 1;
        newUser.id = newID;

     //IF I CONSOLE.LOG(newUser) here then the value for id is 14

    });

    //IF I CONSOLE.LOG(newUser) here then the value for id is NULL

  db.none(
    "INSERT INTO users(id, name, email, active) VALUES ($1, $2, $3, $4)",
    [newUser.id, newUser.name, newUser.email, newUser.active]
  )
    .then(data => {
      res.status(200).json({ msg: "new user was added" });
    })
    .catch(error => {
      console.log("ERROR", error);
    });

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Поскольку вы используете более одного запроса одновременно, вы должны использовать задачу:

await db.task('add-new-user', async t => {
    const count = await t.one('SELECT count(*) FROM users', [], a => +a.count);
    newUser.id = count + 1;
    return t.none('INSERT INTO users(${this:name}) VALUES(${this:csv})', newUser);
});

PS Вместо этого следует использовать тип serial, и тогда вы можете избежать всего этого.

1 голос
/ 24 февраля 2020

назначение newUser.id является областью видимости блока, и я не могу получить доступ к этому значению за его пределами.

Для этого вам потребуется использовать цепочку обещаний:

db.result("SELECT …")
.then(data => {
    newUser.id = parseInt(data.rows[0].count) + 1;
    return db.none("INSERT …", newUser);
}).then(data => {
    res.status(200).json({ msg: "new user was added" });
}, error => {
    console.log("ERROR", error);
});

Я пытаюсь добавить новых пользователей в базу данных, и идентификатор автоматически повторяется

Не делайте два запроса для достижения этой цели. Для этого используйте идентификационный столбец или sequence в базе данных.

Или хотя бы объедините два запроса в один оператор для одновременного выполнения:

db.none(
  "INSERT INTO users(id, name, email, active) VALUES ((SELECT COUNT(*)+1 FROM users), $1, $2, $3)",
  [newUser.name, newUser.email, newUser.active]
)
.then(data => {
  res.status(200).json({ msg: "new user was added" });
}, error => {
  console.log("ERROR", error);
});
...