NestJS Postgres Prisma - 错误类型'字符串'不可分配给参数类型'TemplateStringsArray | Sql'
Posted
技术标签:
【中文标题】NestJS Postgres Prisma - 错误类型\'字符串\'不可分配给参数类型\'TemplateStringsArray | Sql\'【英文标题】:NestJS Postgres Prisma - Error type 'string' is not assignable to parameter type 'TemplateStringsArray | Sql'NestJS Postgres Prisma - 错误类型'字符串'不可分配给参数类型'TemplateStringsArray | Sql' 【发布时间】:2021-12-02 11:33:42 【问题描述】:我正在尝试使用微服务架构构建 NestJS Monorepo 服务,其中 PostgreSQL 作为数据库,Prisma 作为 ORM,TypeScript 作为主要语言。 但是当我尝试执行 Postgres 查询时,我不断收到以下错误。
src/infrastructure/persistence/work.repository.postgres.ts:188:7 - 错误 TS2345:“字符串”类型的参数不可分配给“模板字符串数组”类型的参数 | Sql'。
我检查了数据类型,它们似乎是兼容的。
请帮我解决这个问题。
堆栈:TypeScript、PostgreSQL、Node.JS、Express 和 NestJS。
提前致谢!
async findWriterNumber(writerAddress: string): Promise<number>
const maxNumber = await this.prismaService.$queryRaw<
max: number;
>(
`SELECT coalesce(max('writerNumber') + 1, 0) as max
FROM "Work"
LEFT OUTER JOIN "WriterID"
ON "Work"."id" = "WorkID"."workId" AND "WorkID"."address" = '$writerAddress'`,
);
return maxNumber[0].max;
【问题讨论】:
【参考方案1】:找到一个简单的解决方法:
删除sql语句周围的()。
async findWriterNumber(writerAddress: string): Promise<number>
const maxNumber = await this.prismaService.$queryRaw<
max: number;
>
`SELECT coalesce(max('writerNumber') + 1, 0) as max
FROM "Work"
LEFT OUTER JOIN "WriterID"
ON "Work"."id" = "WorkID"."workId" AND "WorkID"."address" = '$writerAddress'`;
return maxNumber[0].max;
准备好的语句会将查询转换为“select coalesce ... from work where ... address=$1”,并将 $1 作为参数发送 - 因此您无需将其包含在引号中。
【讨论】:
【参考方案2】:另一种解决方案是使用Prisma.sql
助手:
const maxNumber = await this.prismaService.$queryRaw< max: number; >(
Prisma.sql`SELECT coalesce(max('writerNumber') + 1, 0) as max
FROM "Work"
LEFT OUTER JOIN "WriterID"
ON "Work"."id" = "WorkID"."workId"
AND "WorkID"."address" = '$writerAddress'`,
);
return maxNumber[0].max;
【讨论】:
以上是关于NestJS Postgres Prisma - 错误类型'字符串'不可分配给参数类型'TemplateStringsArray | Sql'的主要内容,如果未能解决你的问题,请参考以下文章
NestJS-Prisma,如何编写与 prisma 一对多类型匹配的 DTO
NestJS 中与 GraphQL 的 Prisma 自关系