ServerDatabase
Client Usage
How to use Prisma clients in server and feature code.
Importing Prisma Clients
Core Client (Global Data)
import { basePrisma } from "@repo/crm-db";
// Use for: Users, Sessions, Organizations, Members
const users = await basePrisma.user.findMany();Organization Client (Tenant Data)
import { orgPrisma } from "@repo/crm-db";
// Use for: Entities, Fields, Dynamic records
const entities = await orgPrisma.entity.findMany({
where: { orgId: "org_123" },
});Accessing from HandlerContext
Middleware attaches Prisma to the context:
app.get("/api/entities", requireAuth, async (c) => {
const prisma = c.get("prisma"); // Tenant-scoped
const entities = await prisma.entity.findMany();
});Using with Effect-TS
import { PrismaTag } from "@/lib/tags";
const program = Effect.gen(function* () {
const prisma = yield* PrismaTag;
return yield* Effect.tryPromise(() => prisma.user.findMany());
});Transaction Support
await prisma.$transaction(async (tx) => {
await tx.entity.create({ data: { ... } });
await tx.field.createMany({ data: [...] });
});Best Practices
- Use tenant-scoped client: Always use
c.get("prisma")in route handlers - Use basePrisma: Only for cross-org data (auth, org management)
- Avoid raw queries: Use Prisma client for type safety
- Use transactions: For multi-table operations