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;