Drizzle ORM Schema Patterns
Schema Files
- Main schema:
shared/schema.ts - MLOps schema:
shared/mlops-schema.ts
Core Tables
Tenants (Multi-tenant)
All data is scoped to a tenant. Every query must include tenant filtering.
Users
- Roles:
admin,operator,viewer,platform_admin - Linked to tenant via
tenantId - Password hashed with bcryptjs
Sessions
- PostgreSQL-backed session store
- Used with
connect-pg-simple
Patterns
Define a table:
import { pgTable, text, serial, integer, timestamp } from "drizzle-orm/pg-core";
export const myTable = pgTable("my_table", {
id: serial("id").primaryKey(),
tenantId: integer("tenant_id").notNull().references(() => tenants.id),
name: text("name").notNull(),
createdAt: timestamp("created_at").defaultNow(),
});
Create Zod schemas:
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
export const insertMyTableSchema = createInsertSchema(myTable);
export const selectMyTableSchema = createSelectSchema(myTable);
Query with tenant isolation:
import { eq, and } from "drizzle-orm";
const results = await db
.select()
.from(myTable)
.where(and(eq(myTable.tenantId, tenantId), eq(myTable.id, id)));
Configuration
drizzle.config.ts— migration config- Push schema:
npm run db:push - Connection via
DATABASE_URLenv variable