jhd*_*vuk 2 sql postgresql node.js typeorm
我试图弄清楚为什么以下原始 SQL 可以与 PostGres 完美配合,而通过 TypeORM 生成的 SQL 则不能。
运行这个作品:
SELECT symbol, MAX(created_at) AS created_at
FROM update_history
WHERE exchange = 'NYSE'
AND data_type = 'companyRecord'
GROUP BY symbol
ORDER BY created_at ASC
Run Code Online (Sandbox Code Playgroud)
示例: https: //dbfiddle.uk/yocl-rBq
而 TypeORM sql 由以下命令生成:
const result = this.repository
.createQueryBuilder('h1')
.select(['MAX(h1.createdAt) AS created_at', 'h1.symbol'])
.where('h1.exchange = :exchange', { exchange })
.andWhere('h1.dataType = :dataType', { dataType })
.groupBy('h1.symbol')
.orderBy({ created_at: 'ASC' })
.take(limit)
.getMany();
/* Produces this:
SELECT "h1"."symbol" AS "h1_symbol",
MAX("h1"."created_at") AS created_at
FROM "update_history" "h1"
WHERE "h1"."exchange" = 'NYSE'
AND "h1"."data_type" = 'companyRecord'
GROUP BY "h1"."symbol"
ORDER BY created_at ASC LIMIT 5000
*/
Run Code Online (Sandbox Code Playgroud)
示例(第二个选择框):https ://dbfiddle.uk/yocl-rBq
返回以下错误:
QueryFailedError:列“h1.id”必须出现在 GROUP BY 子句中或在聚合函数中使用
如果我添加h1.id到该GROUP BY子句,查询将不再返回正确的结果集,因为它实际上是不同的。
正如您从 DBFiddle 链接中看到的,两个生成的 SQL 查询都在 TypeORM 之外工作。
我在这里缺少什么?
您正在使用getMany()它总是id在select. 您粘贴的查询很可能在添加之前已被记录getMany()。尝试logging: true在您的设置中进行设置ormconfig.js,您将看到正在触发的确切查询。
您应该使用getRawMany(),您将能够获得准确的查询以及所需的结果。
| 归档时间: |
|
| 查看次数: |
8743 次 |
| 最近记录: |