1.0.1 • Published 6 months ago
@sixaphone/nestjs-drizzle v1.0.1
Description
A module for using drizzle-orm in NestJS
Project setup
$ npm i @sixaphone/nestjs-drizzle
Register connections
import { Module } from '@nestjs/common';
import { DrizzleModule } from '@sixaphone/nestjs-drizzle';
import { schema } from './database/schema';
import tursoConfig, { TursoConfig } from './config/turso.config';
import { DBS } from './constants';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
// local with custom name
DrizzleModule.forRoot({
type: 'sqlite',
name: DBS.LOCAL,
url: 'file:project.db',
schema,
}),
// local with default name
DrizzleModule.forRoot({
type: 'sqlite',
url: 'file:defaukt_db.db',
schema,
}),
// remote turso with custom name
DrizzleModule.forRootAsync({
name: DBS.TURSO,
useFactory: (tursoConfig: TursoConfig) => {
return {
type: 'sqlite',
url: tursoConfig.databaseUrl!,
authToken: tursoConfig.authToken!,
schema,
};
},
imports: [ConfigModule.forFeature(tursoConfig)],
inject: [tursoConfig.KEY],
}),
ConfigModule.forRoot({}),
],
})
export class AppModule {}
Add Entities for feature
@Module({
imports: [
// for local named
DrizzleModule.forFeature({
entities: [users],
name: DBS.LOCAL,
}),
// for local default
DrizzleModule.forFeature({
entities: [users],
}),
// for remote named
DrizzleModule.forFeature({
entities: [users],
name: DBS.TURSO,
}),
],
providers: [MyService],
controllers: [MyController],
})
export class MyModule {}
Usage
You can choose to either use the client or a entity repository. Using the client will give full access to the underlying drizzle client connection, while the repository will limit the functionality.
Using Client
import { Injectable } from '@nestjs/common';
import { DrizzleDatabase, InjectClient } from '@sixaphone/nestjs-drizzle';
@Injectable()
export class UserService {
constructor(
// inject the name here or leave empty for default
@InjectClient('local')
private readonly drizzleLocal: DrizzleDatabase<'sqlite', Schema>,
) {}
public async createUser(name: string) {
const user = await this.drizzleLocal.transaction((tx) => {
return tx
.insert(urls)
.values({
name,
})
.returning();
});
return user;
}
}
Using repository
import { Injectable } from '@nestjs/common';
import { DrizzleRepository, InjectRepository } from '@sixaphone/nestjs-drizzle';
import { eq } from 'drizzle-orm';
import { users } from 'src/database/user.entity';
@Injectable()
export class UserService {
constructor(
// inject the name here or leave empty for default
@InjectRepository(users, 'local')
private readonly userRepository: DrizzleRepository<
Schema,
'users',
'sqlite'
>,
) {}
public async createUser(name: string) {
const [user] = await this.userRepository.insert({
name
});
return user;
}
public async getByName(name: string) {
// select user by name and only take name field
// select name from users where name = $1
const [user] = await this.userRepository.selectWhere(eq(users.name, name), {name: users.name});
// or
const [user] = await this.userRepository.select({name: users.name}).where(eq(users.name, name));
return user;
}
}
Example
Check out the example url-redirect app in example/ directory
Support
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please read more here.