以 RESTfull 方式计算数据库列中的空条目
count null entries in database column in a RESTfull way
我正在使用 express.js 和 pg-promise 从 postgreSQL 数据库 (timescaleDB) 获取数据。获取 table 中的列不是问题。
数据存储在table中,格式为:
| time | measurement1 | measurement2 |
|------+--------------+--------------|
| .... | 0,2 | 0,55 |
|------+--------------+--------------|
| .... | null | 0,58 |
其中 time 是顺序时间戳。
我正在尝试创建一个端点来计算给定列中的空条目,方法如下:
router.get('/:name/count', async (req, res) => {
await db.one("SELECT count(*) FROM WHERE IS NULL"), ['mytable', req.params.name], c => c.count)
.then(data => res.status(200).send(data))
.catch(err => console.log(err));
});
目的是创建用于分析存储在 table 中的数据的端点,使用 SQL-查询 count,avg 、max、min等
url中的name对应我数据库中的一个table列。
如果我使用 URL '/' 或 /:name,但不使用 '/:name/count',这会起作用,然后我会收到错误消息:
错误:类型间隔的输入语法无效:“”count”
到目前为止,我的解决方案是在 pg-promise 任务中返回计数:
router.get('/:name', async (req, res) => {
db.task(async t => {
const data = await t.any("SELECT :name, :name FROM :name ORDER BY(:name)", [req.params.name, 'time', 'mytable',]);
const numOfNulls = await db.one("SELECT count(*) FROM :name WHERE :name IS NULL", ['mytable', req.params.name], c => c.count);
return {data, numOfNulls}
})
.then(({data, numOfNulls}) => res.status(200).send({data, numOfNulls}))
.catch(err => console.log(err))
});
这有效,但当我想有一个单独的端点来获取列时,它不是最佳选择。
如何为计数端点构造一个合适的 URL?
编辑:
我还有一个带有 url /:name/:decimation 的端点与 timescaleDB time_bucket()-函数一起使用,其中 decimation 是 '1m', '5m', '1h' 等。当我注释掉这个端点时,端点 /:name/count 有效。
如何保留这两个端点?
您的代码有一点 async/chain 语法混淆,而且您没有正确转义 valus。正确的代码应该是这样的:
router.get('/:name/count', async (req, res) => {
try {
const {count} = await db.one('SELECT count(*) FROM :name WHERE :name IS NULL',
['mytable', req.params.name]);
res.status(200).send(count);
} catch(err) {
console.log(err);
}
});
而且您的解决方法看起来也不对 - 它在任务中使用了错误的数据库上下文 db
,而它应该是 t
:
router.get('/:name', async (req, res) => {
try {
const result = await db.task(async t => {
const data = await t.any('SELECT :name, :name FROM :name ORDER BY(:name)', [req.params.name, 'time', 'mytable']);
const {count:numOfNulls} = await t.one('SELECT count(*) FROM :name WHERE :name IS NULL', ['mytable', req.params.name]);
return {data, numOfNulls};
});
res.status(200).send(result));
});
} catch(err) {
console.log(err);
}
我正在使用 express.js 和 pg-promise 从 postgreSQL 数据库 (timescaleDB) 获取数据。获取 table 中的列不是问题。
数据存储在table中,格式为:
| time | measurement1 | measurement2 |
|------+--------------+--------------|
| .... | 0,2 | 0,55 |
|------+--------------+--------------|
| .... | null | 0,58 |
其中 time 是顺序时间戳。
我正在尝试创建一个端点来计算给定列中的空条目,方法如下:
router.get('/:name/count', async (req, res) => {
await db.one("SELECT count(*) FROM WHERE IS NULL"), ['mytable', req.params.name], c => c.count)
.then(data => res.status(200).send(data))
.catch(err => console.log(err));
});
目的是创建用于分析存储在 table 中的数据的端点,使用 SQL-查询 count,avg 、max、min等
url中的name对应我数据库中的一个table列。
如果我使用 URL '/' 或 /:name,但不使用 '/:name/count',这会起作用,然后我会收到错误消息:
错误:类型间隔的输入语法无效:“”count”
到目前为止,我的解决方案是在 pg-promise 任务中返回计数:
router.get('/:name', async (req, res) => {
db.task(async t => {
const data = await t.any("SELECT :name, :name FROM :name ORDER BY(:name)", [req.params.name, 'time', 'mytable',]);
const numOfNulls = await db.one("SELECT count(*) FROM :name WHERE :name IS NULL", ['mytable', req.params.name], c => c.count);
return {data, numOfNulls}
})
.then(({data, numOfNulls}) => res.status(200).send({data, numOfNulls}))
.catch(err => console.log(err))
});
这有效,但当我想有一个单独的端点来获取列时,它不是最佳选择。
如何为计数端点构造一个合适的 URL?
编辑:
我还有一个带有 url /:name/:decimation 的端点与 timescaleDB time_bucket()-函数一起使用,其中 decimation 是 '1m', '5m', '1h' 等。当我注释掉这个端点时,端点 /:name/count 有效。
如何保留这两个端点?
您的代码有一点 async/chain 语法混淆,而且您没有正确转义 valus。正确的代码应该是这样的:
router.get('/:name/count', async (req, res) => {
try {
const {count} = await db.one('SELECT count(*) FROM :name WHERE :name IS NULL',
['mytable', req.params.name]);
res.status(200).send(count);
} catch(err) {
console.log(err);
}
});
而且您的解决方法看起来也不对 - 它在任务中使用了错误的数据库上下文 db
,而它应该是 t
:
router.get('/:name', async (req, res) => {
try {
const result = await db.task(async t => {
const data = await t.any('SELECT :name, :name FROM :name ORDER BY(:name)', [req.params.name, 'time', 'mytable']);
const {count:numOfNulls} = await t.one('SELECT count(*) FROM :name WHERE :name IS NULL', ['mytable', req.params.name]);
return {data, numOfNulls};
});
res.status(200).send(result));
});
} catch(err) {
console.log(err);
}