Nest.js 与 Drizzle ORM

问题描述 投票:0回答:1

除了提供者之外,还有其他更优雅的方式在 Nest.js 中使用 Drizzle ORM 吗?例如,就像在 Prisma 和 PrismaService 中一样,我发现的只是像这样的提供商:

import { Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
import * as schema from './schema';

export const PG_CONNECTION = "PG_CONNECTION"; // ignore that it is not separate file

@Module({
  providers: [
    {
      provide: PG_CONNECTION,
      inject: [ConfigService],
      useFactory: async (config: ConfigService) => {
        const connection = postgres(config.get("DATABASE_URL"));
        return drizzle(connection, { schema });
      },
    },
  ],
  exports: [PG_CONNECTION],
})
export class DrizzleModule {}

然后:

import { Inject, Injectable } from '@nestjs/common';
import { PG_CONNECTION } from '../drizzle/drizzle.module';
import { dbType } from 'drizzle-orm/postgres-js'; // ignore, it doesn't matter yet
import * as schema from '../drizzle/schema';

@Injectable()
export class UsersService {
  constructor(@Inject(PG_CONNECTION) private drizzle: dbType<typeof schema>) {} // what I'm talking about

  async findAll() {
    return await this.drizzle.query.users.findMany();
  }
}

我在说什么,我们应该每次都注入(提供者?),从数据库客户端导入常量和类型,而不是这样:

import { Inject, Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service'

@Injectable()
export class UsersService {
  constructor(private prisma: PrismaService) {}

  async findAll() {
    return await this.prisma.users.findMany();
  }
}

我试图找到解决方案,但似乎这个话题确实不受欢迎。我期待如此大的 Nest.js 和 Drizzle ORM 社区能够有一个很好的解决方案来将 Drizzle 与 Nest 一起使用

postgresql nestjs drizzle-orm
1个回答
0
投票

您可以围绕

PG_CONNECTION
注入令牌创建自己的包装类。类似的东西

@Injectable()
export class DrizzleService {
  constructor(@Inject(PG_CONNECTION) readonly db: dbType<typeof schema>) {}
}

现在,您不再从

PG_CONNECTION
导出
DrizzleModule
令牌,而是导出
DrizzleService
。这将允许您使用类似的
private readonly drizzle: DrizzleService
,就像您可以使用
prisma
一样,然后访问
this.drizzle.db
以在其他提供者内部进行类型化数据库访问。

© www.soinside.com 2019 - 2024. All rights reserved.