首页 > 解决方案 > 如何使用 postgresql 和 kenx.js 从表中查询最近 3 个月的行

问题描述

我正在使用在节点服务器上运行的 Postgresql db 和 Knenx,并尝试编写一个查询表的函数customeractivity(如下图所示)。我的目标是检索与customernbr. 我编写了getRecentTransaction如下所述的函数:

getRecentTransaction = async (customerId, db) => {
   return await db('customeractivity')
      .select('docdesc', 'origdocamt', 'docdate',)
      .whereRaw(`docdate < INTERVAL '? month'`, [1])
      .andWhere('customernbr', '=', `${customerId}`)
      .then(recentTransaction => recentTransaction[0])
      .catch(error => Promise.reject(error));
}

正如你们所看到的,我能够使用 PSequel 来检索正确的数据。但是,我正在努力用 Knex 编写相同的查询。

续集

标签: postgresqlknex.js

解决方案


您提供的 SQL 是:

SELECT * FROM customeractivity
  WHERE docdate > CURRENT_DATE - INTERVAL '3 months'
    AND customernbr = '713610'
  ORDER BY docdate DESC;

此查询的 Knex 版本是:

knex('customeractivity')
  .where('docdate', '>', knex.raw(`CURRENT_DATE - '3 MONTH'::INTERVAL`))
  .andWhere('customernbr', '713610');

请注意,这return await是多余的(并且不会做您可能期望的事情)。您真正需要做的就是返回 Knex 链:

const getRecentTransaction = (customerId, db) =>
  db('customeractivity')
    .where('docdate', '>', knex.raw(`CURRENT_DATE - '3 MONTH'::INTERVAL`))
    .andWhere('customernbr', customerId);

并在调用代码中等待它:

const result = await getRecentTransaction(5, db);

推荐阅读