javascript - 尝试使用“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
我敢肯定,这个问题有一个简单的答案,我觉得问起来很糟糕,但我不想再烧一个小时把头撞在墙上。
解决方案
今天解决了这个问题。由于每个函数都会关闭 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();
});
}
推荐阅读
- c# - 命令“.NET:为构建和调试生成资产”导致错误(未找到命令“dotnet.generateAssets”)
- python - 熊猫适用于后续行的条件和分组依据
- html - 如何将图像置于文本下方
- exception - 创建用户定义的异常
- python - Python中从头开始的for循环
- php - 如何在php中打印对象值
- c# - 来自 ASP.Net 核心的 Swagger 设置参数属性
- reactjs - 使用 Axios 处理从 API 检索数据
- python - 在 python 中以给定频率(月)向后移动时间直到特定日期
- c# - Dapper 没有以一对一的关系更新 MySQL 中的记录