如何使用 KnexJS 获得正确的结果 运行 PostgreSQL 查询,该查询在数据库的 SQL 脚本编辑器中工作

How to have the proper results using KnexJS to run a PostgreSQL query which works in a SQL script editor in a DB

我正在尝试将在 SQL 脚本编辑器中运行的 PSQL 查询转换为 Knex.js。

我不知道如何得到我的结果我通过 Knex.js 进入数据库查询,我尝试了下面的内容。

Knex.js 查询的结果不是我想要的,我不知道如何获得结果,如下所述。

查询如下

select
    *
from
    (
    select
        d.id id,
        unnest(d.recipients) recipient
    from
        documents d) as result
where
    recipient = 'xxxx'

此查询从数据库返回的结果为

id 收件人
12 xxx
22 xxx

收件人始终相同,ID 是收件人拥有的文档。 我想要与 Knex.js 相同的结果甚至更好,但我得到了不同的结果,不知道该怎么做。

我试着让 knex 功能如下

findDocuments(recipientId) {
    return this.tx.raw(
      `
      SELECT
          *
        FROM
          (
          SELECT
            d.id id,
            UNNEST(d.recipients) recipient
          FROM
            documents d) as result
        WHERE
          recipient = '${recipientId}';
          `
    );
  }

但这在控制台中给出了不同的结果

{
   command: 'SELECT',
   rowCount: 0,
   oid: null,
   rows: [],
   fields: [
     Field {
       name: 'id',
       tableID: 19834,
       columnID: 1,
       dataTypeID: 23,
       dataTypeSize: 4,
       dataTypeModifier: -1,
       format: 'text'
     },
     Field {
       name: 'recipient',
       tableID: 0,
       columnID: 0,
       dataTypeID: 25,
       dataTypeSize: -1,
       dataTypeModifier: -1,
       format: 'text'
     }
   ],
   _parsers: [ [Function: parseInteger], [Function: noParse] ],
   _types: TypeOverrides {
     _types: {
       getTypeParser: [Function: getTypeParser],
       setTypeParser: [Function: setTypeParser],
       arrayParser: [Object],
       builtins: [Object]
     },
     text: {},
     binary: {}
   },
   RowCtor: null,
   rowAsArray: false
 }

您可能没有执行交易,这取决于您是否或如何调用函数 findDocuments()

也尝试将以下函数添加到您的程序中并执行它:

function runTheSQL() {
   return findDocuments()          // async execution of the query.
      .then( function(returnData) {
          console.log(returnData); // prints the query results to the console.
      });
};
runTheSQL();

您还可以将以下子句添加到您的 knex 语句(在 findDocuments() 函数内)以显示将要执行的实际 SQL。

.on('query', function(data) {
    // outputs the SQL query you generated & runtime data bindings.
    console.log(data);
})