首页 > 解决方案 > 尝试使用“make-runnable”在一个命令中运行多个 pg 池查询函数

问题描述

学习如何使用 Postgres 并且难以以线性方式调用多个异步池函数。

我想删除我所有的表,创建所有这些表,并在 Powershell 上的一个命令中为所有这些表做种。我为此使用了 npm 模块“make-runnable”。这些功能是独立运行的,但是每次我想尝试新的东西时一次输入一个是很痛苦的。

我回顾了异步语法是如何工作的,并且过去我已经成功地使用过它。我查看了 pool 的工作原理,但我只是得到了很多关于它的语法的解释。

我的三个函数基本上都是这个结构,并且使用相同的 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();
}

一个被调用,(或者可能它们都尝试并触发,因为它们不是一次运行一个?)似乎是随机的,因为命令在 shell 的输出中每次都可能不同:

--------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

我敢肯定,这个问题有一个简单的答案,我觉得问起来很糟糕,但我不想再烧一个小时把头撞在墙上。

标签: javascriptnode.jspostgresqlasynchronouspool

解决方案


今天解决了这个问题。由于每个函数都会关闭 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();
    });
}

推荐阅读