NestJS Postgres Prisma - 错误类型 'string' 不可分配给参数类型 'TemplateStringsArray | Sql'
NestJS Postgres Prisma - Error type 'string' is not assignable to parameter type 'TemplateStringsArray | Sql'
我正在尝试使用微服务架构构建 NestJS Monorepo 服务,其中 PostgreSQL 作为数据库,Prisma 作为 ORM,TypeScript 作为主要语言。
但是当我尝试执行 Postgres 查询时,我不断收到以下错误。
src/infrastructure/persistence/work.repository.postgres.ts:188:7 - 错误 TS2345:'string' 类型的参数不可分配给 'TemplateStringsArray | 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;
}
找到一个简单的修复方法:
删除 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 作为参数发送 - 因此您不需要将其包装起来语录。
另一个解决方案是使用 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 Monorepo 服务,其中 PostgreSQL 作为数据库,Prisma 作为 ORM,TypeScript 作为主要语言。 但是当我尝试执行 Postgres 查询时,我不断收到以下错误。
src/infrastructure/persistence/work.repository.postgres.ts:188:7 - 错误 TS2345:'string' 类型的参数不可分配给 'TemplateStringsArray | 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;
}
找到一个简单的修复方法:
删除 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 作为参数发送 - 因此您不需要将其包装起来语录。
另一个解决方案是使用 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;