Попытка запустить несколько функций запроса pg pool одной командой, используя make-runnable - PullRequest
0 голосов
/ 09 апреля 2019

Изучение, как использовать Postgres, и трудности с вызовом нескольких асинхронных функций пула линейным способом.

Я хочу отбросить все свои таблицы, создать все эти таблицы и заполнить все эти таблицы одной командой в Powershell.Я использую модуль npm 'make-runnable' для этого.Функции выполняются изолированно, но набирать их по одной за раз каждый раз, когда я хочу попробовать что-то новое, очень сложно.

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

Мои три функции в основном представляют собой эту структуру и используют один и тот же вызов pool.query ():

const createTables = () => {
    const taskTableText = 
        `CREATE TABLE IF NOT EXISTS
            acts(
                id UUID DEFAULT uuid_generate_v1 (),
                name VARCHAR(128) NOT NULL,
                length INTERVAL NOT NULL,
                percent_complete INT NOT NULL,
                start_stamp TIMESTAMPTZ NOT NULL,
                PRIMARY KEY (id)
            )
        `;


    pool.query(taskTableText)
        .then((res) => {
            console.log(res);
            pool.end();
        })
        .catch((err) => {
            console.log(err);
            pool.end();
        });

}

Это хорошо работает в Powershell, но когда я пытаюсь сделать три вместе, как

const makeFresh = async function() {
    const stepOne = await dropTables();
    const stepTwo = await createTables();
    const stepThree = await seedTables();
}

Один получает вызов (или, возможно, они все пытаются и стреляют, потому что они не работают по одному за раз?) на первый взгляд случайным образом, поскольку в выводе оболочки команда может отличаться каждый раз:

--------make-runnable-output--------
undefined
------------------------------------
connected to db
connected to db
connected to db
Result {
  command: 'DROP',
  rowCount: null,
  oid: null,
  rows: [],
  fields: [],
  _parsers: [],
  RowCtor: null,
  rowAsArray: false,
  _getTypeParser: [Function: bound ] }
client removed

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

1 Ответ

0 голосов
/ 17 апреля 2019

Решил эту проблему сегодня. Поскольку каждая функция закрывает пул pg, последующие вызовы не могут выполнять свою работу. Сделайте так, чтобы каждый из них по умолчанию закрывал пул, чтобы их можно было продолжать вызывать изолированно, но если будет передано истинное значение, они позволят пулу оставаться открытым, чтобы его могли использовать другие функции.

Мой новый пример создания таблиц выглядит так:

const createTables = async (isKeepingPoolOpen = false) => {

    const taskTableText = 
        `CREATE TABLE IF NOT EXISTS
            acts(
                id UUID DEFAULT uuid_generate_v1 (),
                name VARCHAR(128) NOT NULL,
                length INTERVAL NOT NULL,
                percent_complete INT NOT NULL,
                start_stamp TIMESTAMPTZ NOT NULL,
                PRIMARY KEY (id)
            )
        `;

    return pool.query(taskTableText)
        .then((res) => {
            console.log(res);
            isKeepingPoolOpen === true ? '' : pool.end();
        })
        .catch((err) => {
            console.log(err);
            isKeepingPoolOpen === true ? '' : pool.end();
        });
}

Моя новая функция «Позвони им всем» теперь выглядит следующим образом:

const makeFresh = function() {
    const isKeepingPoolOpen = true;
    dropTables(isKeepingPoolOpen)
    .then(() => createTables(isKeepingPoolOpen))
    .then(() => seedTables(isKeepingPoolOpen))
    .then(() => {
        pool.end();
    })
    .catch((err) => {
        console.log("error: " + error);
        pool.end();
    });
}
...