以 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-查询 countavg maxmin

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);
   }