Skip to content

Instantly share code, notes, and snippets.

@Angelelz
Created November 2, 2023 03:11
Show Gist options
  • Save Angelelz/a9fee673e8e2d8f73a27299cd2a9a7d3 to your computer and use it in GitHub Desktop.
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
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