Created
November 2, 2023 03:11
-
-
Save Angelelz/a9fee673e8e2d8f73a27299cd2a9a7d3 to your computer and use it in GitHub Desktop.
Quick example on how some kind of repository pattern can be implemented for Drizzle
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { MySqlTable } from "drizzle-orm/mysql-core"; | |
import { db as drizzleDb } from "./mysql/mysql2"; | |
import { eq } from "drizzle-orm"; | |
import { users } from "./mysql/schema"; | |
interface Reader<T extends MySqlTable & { id: any }> { | |
findAll(): Promise<T["$inferSelect"][]>; | |
findOne(id: number): Promise<T["$inferSelect"] | undefined>; | |
} | |
export abstract class Repository<T extends MySqlTable & { id: any }> | |
implements Reader<T> | |
{ | |
constructor( | |
private db: typeof drizzleDb, | |
private table: T, | |
) {} | |
findAll() { | |
return this.db.select().from(this.table).execute(); | |
} | |
async findOne(id: number) { | |
return ( | |
await this.db | |
.select() | |
.from(this.table) | |
.where(eq(this.table.id, id)) | |
.execute() | |
).at(0); | |
} | |
} | |
class UserRepository< | |
T extends MySqlTable & { id: any }, | |
> extends Repository<T> {} // You can extend with other methods if you want | |
const usersRepository = new UserRepository(drizzleDb, users); | |
const user = await usersRepository.findOne(1); | |
console.log(user); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment