Выполнить несколько запросов к базе данных (обещания) последовательно - PullRequest
3 голосов
/ 03 марта 2020

Сами запросы к базе данных не являются проблемой - они работают нормально.

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

DELETE FROM myTable;
INSERT INTO myTable(c1, c2, c3) VALUES (x, y, z);
SELECT * FROM myTable;

И я не могу понять о том, как это сделать в Node, независимо от того, что я пытаюсь. Этот вопрос представляется наиболее популярным решением, и он заставил бы меня сделать что-то подобное (где client равно из pg и должно возвращать обещания):

// client is my database client, has already been initialized
// f is an object corresponding to my database
var res;
Promise.resolve()
      .then(() => {
          console.log("Deleting");
          return client.query("DELETE FROM FileFormat");
      })
      .then(() => {
        console.log("Inserting");
        return client.query("INSERT INTO myTable(c1, c2, c3) VALUES ($1, $2, $3)", [f.x, f.y, f.z]);
      })
      .then(() => {
        console.log("Selecting");
        return client.query("SELECT * FROM FileFormat").then((err, result) => res = result.rows)
      })
      .then(() => {
        console.log("Finished");
        console.log(res);
      })

Я ожидаю, что он напечатает Deleting, затем Inserting, затем Selecting, затем Finished, затем данные, которые я только что вставил в базу данных.

Вместо этого , он печатает Deleting, а затем ничего не делает.

Я не хочу бесконечно связывать client.query.then(client.query.then(...)), потому что это делает мой код произвольно растянутым с большим отступом. Я бы предпочел, чтобы мой код был как можно более плоским, и выполнял бы эти вызовы последовательно, ожидая, пока каждый завершит работу sh, прежде чем начинать следующий. Как мне это сделать?

1 Ответ

1 голос
/ 04 марта 2020

Ответ из моих комментариев на исходный вопрос

Возможно, клиент фактически не выполняет обещания, которые могут вызвать такое поведение. Если вы удалите все client.query, вы увидите, что все журналы будут выглядеть так, как вы ожидаете. Ваш код Javascript уже выполняет то, что вы хотите, и проблема, похоже, связана с клиентом PG.

...