【发布时间】:2019-06-07 20:48:01
【问题描述】:
我想知道如何在 TypeORM 或 POSTGRESQL 原始查询中解构数组变量。
我有以下疑问:
getConnection()
.query(`SELECT m.col1, m.col2, m.col3, t.col1, c.col1
FROM schema.msomething m
LEFT JOIN schema.csomething c ON m.col1 = c.col1
LEFT JOIN schema.tsomething t ON m.col1 = t.col1
WHERE ((m.start_date, m.end_date) OVERLAPS ($1, $2))
AND (c.col1 IN ('valueA', 'valueB', 'valueC'))`,
[
start_date,
end_date
]
);
此查询按预期工作正常,但我希望 ('valueA', 'valueB', 'valueC') 成为分配给 $3 的动态值,这将是一个 数组,
我尝试了以下方法:
AND (c.col1 IN (...$3))
或
AND (c.col1 IN $3)
...但是任何一个都不起作用。
【问题讨论】:
-
您应该能够使用命名占位符并说
c.col1 in (:...vals)和{ vals: ['valueA', 'valueB', 'valueC'] }(github.com/typeorm/typeorm/issues/1239#issuecomment-366955628) 而不是 PostgreSQL 样式的编号占位符。 -
我需要使用原始查询,因为我在这里使用
OVERLAPS,:var的使用在.query()中不起作用 -
但是
where('... overlaps (:start, :end)', { start: start_date, end: end_date })在这种情况下不工作吗?我不认为 ORM 真正理解 SQL,它可能只是结合类型检查和转义进行一些字符串处理。否则,您必须构建正确数量的编号占位符,然后 splat 数组为这些占位符提供值。
标签: node.js postgresql typeorm