Node.js 使用TypeForm在postgres的数组中搜索项目
数据库:postgres ORM:Typeorm 框架:express.js 我有一个表,其中一个名为Node.js 使用TypeForm在postgres的数组中搜索项目,node.js,postgresql,typescript,express,typeorm,Node.js,Postgresql,Typescript,Express,Typeorm,数据库:postgres ORM:Typeorm 框架:express.js 我有一个表,其中一个名为projects的字段是字符串数组。在迁移中,类型设置为“varchar”,反装饰器设置为“simple array” 在我的获取路径中,如果我收到一个查询?project=name\u\u\u\u项目,它应该尝试在简单数组中查找该项目 对于搜索,我的获取路径如下所示: studentsRouter.get("/", async (request, response) =&g
projects
的字段是字符串数组。在迁移中,类型设置为“varchar”
,反装饰器设置为“simple array”
在我的获取路径中,如果我收到一个查询?project=name\u\u\u\u项目
,它应该尝试在简单数组中查找该项目
对于搜索,我的获取路径如下所示:
studentsRouter.get("/", async (request, response) => {
const { project } = request.query;
const studentRepository = getCustomRepository(StudentRepository);
const students = project
? await studentRepository
.createQueryBuilder("students")
.where(":project = ANY (students.projects)", { project: project })
.getMany()
: await studentRepository.find();
// const students = await studentRepository.find();
return response.json(students);
});
问题是我得到了一个错误,认为右边应该是数组
(node:38971) UnhandledPromiseRejectionWarning: QueryFailedError: op ANY/ALL (array) requires array on right side
at new QueryFailedError (/Users/Wblech/Desktop/42_vaga/src/error/QueryFailedError.ts:9:9)
at Query.callback (/Users/Wblech/Desktop/42_vaga/src/driver/postgres/PostgresQueryRunner.ts:178:30)
at Query.handleError (/Users/Wblech/Desktop/42_vaga/node_modules/pg/lib/query.js:146:19)
at Connection.connectedErrorMessageHandler (/Users/Wblech/Desktop/42_vaga/node_modules/pg/lib/client.js:233:17)
at Connection.emit (events.js:200:13)
at /Users/Wblech/Desktop/42_vaga/node_modules/pg/lib/connection.js:109:10
at Parser.parse (/Users/Wblech/Desktop/42_vaga/node_modules/pg-protocol/src/parser.ts:102:9)
at Socket.<anonymous> (/Users/Wblech/Desktop/42_vaga/node_modules/pg-protocol/src/index.ts:7:48)
at Socket.emit (events.js:200:13)
at addChunk (_stream_readable.js:294:12)
(node:38971) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:38971) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
编辑-01
在文档中,我发现简单数组
存储由逗号分隔的字符串。我想这意味着它是一个由逗号分隔的字符串。在本例中,是否有方法在“项目”字段中查找具有字符串的行
链接-
编辑02
字段项目存储学生正在做的项目,因此数据库返回以下json:
{
"id": "e586d1d8-ec03-4d29-a823-375068de23aa",
"name": "First Lastname",
"intra_id": "flastname",
"projects": [
"42cursus_libft",
"42cursus_get-next-line",
"42cursus_ft-printf"
]
},
根据对问题的评论和更新,@WincentyBertoniLech确定ORM将
项目数组作为逗号分隔的文本值存储在students.projects
列中
我们可以使用string\u to\u array()
将其转换为适当的标准,其中
标准:
.where(":project = ANY ( string_to_array(students.projects, ','))", { project: project })
看起来,projects
列应该有数据类型varchar[]
(或text[]
),而不仅仅是varchar
@GMB,我尝试了这个,得到了相同的错误。projects
中实际存储了什么?你能提供一个例子吗?你能直接查询数据库吗?ORM生成的内容没有帮助,因为它是格式化的。有一个函数您可以尝试:。其中(“:project=ANY(string_to_array(students.projects,,)”,{project:project})
您可能需要根据ORM使用的内容调整分隔符。@MikeOrganek,成功了!请给我一个答案,这样我可以检查一下。
{
"id": "e586d1d8-ec03-4d29-a823-375068de23aa",
"name": "First Lastname",
"intra_id": "flastname",
"projects": [
"42cursus_libft",
"42cursus_get-next-line",
"42cursus_ft-printf"
]
},
.where(":project = ANY ( string_to_array(students.projects, ','))", { project: project })