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

Prisma 2 不适用于 NestJS 规范测试

NestJS 中与 GraphQL 的 Prisma 自关系

使用 Prisma 2 和 NestJS 进行日志记录 - 依赖注入问题?

prisma查询postgresql到nestJs

NestJS-Prisma 如何使用关系字段创建记录?