【发布时间】:2018-11-15 05:55:15
【问题描述】:
我一直试图弄清楚如何选择 Postgres 数据库中的每条记录,这些记录在具有整数数组的列中包含某个 id。我对这一切都很陌生,但我相信我想要一个看起来像这样的 SQL 语句:
SELECT * FROM members WHERE 2 = ANY(skill_id_array);
skill_id_array 列中的数据如下所示:{1,4,7}。
我从 Angular 前端传入一个 id,例如 2 作为参数。登录终端显示 select 语句的结尾,但它失败了:
... WHERE $1 ANY (skill_id_array) -- PARAMETERS: [2]
我认为问题在于我试图将变量传递到代码中,但它讨厌它。请注意,我一直在尝试 find 方法和 QueryBuilder。产生的错误在 cmets 中。 (完整的 CRUD 工作正常,所以我的整体设置很好。)
这很好用,但我知道这有一个 sql 注入问题:
const membersBySkill = await this.entityManager.query(
`SELECT * FROM members WHERE ${integerId} = ANY(members.skill_id_array)`
);
这可行,但我不确定是否存在 sql 注入问题,而且我想使用 TypeORM find 或 QueryBuilder。
const sql = 'SELECT * FROM members WHERE '+ integerId + ' = ANY(skill_id_array)';
const membersBySkill = await this.entityManager.query(sql);
为我服务:
import {Any} from "typeorm";
async getMembersBySkill(id) {
const integerId = parseInt(id, 10); // convert id to integer for Postgres array.
// console.log('skill_id in service', integerId);
// Find one skill id in an array of id's.
/*
const membersBySkill = await this.connection.getRepository(Members).find({
skill_id_array: Any(integerId)
});
// This results in an IDE error. It doesn't like a number as
// the ANY param. "{integerId: number} is not assignable to
// parameter type '{}[] | FindOperator<{}>'.
// In terminal: error: could not find array type for data type integer[].
// However, the db has integers.
*/
const membersBySkill = await getRepository(Members)
.createQueryBuilder("members")
.select('*')
.where(":id IN (skill_id_array)", {id: integerId})
.getMany();
// SELECT * FROM "members" "members" WHERE $1 IN (skill_id_array) -- PARAMETERS: [2]
// server console: error: malformed array literal: "2"
console.log('membersBySkill: ', membersBySkill);
return membersBySkill;
}
实体:
@Column('int', { array: true, nullable: true})
skill_id_array: number[];
Postgres 列类型:integer[]
每次更改时我都会停止并启动 Nestjs 服务器。
【问题讨论】:
标签: typeorm