Database schema patterns using Drizzle ORM with PostgreSQL
shared/schema.tsshared/mlops-schema.tsAll data is scoped to a tenant. Every query must include tenant filtering.
admin, operator, viewer, platform_admintenantIdconnect-pg-simpleimport { 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(),
});
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
export const insertMyTableSchema = createInsertSchema(myTable);
export const selectMyTableSchema = createSelectSchema(myTable);
import { eq, and } from "drizzle-orm";
const results = await db
.select()
.from(myTable)
.where(and(eq(myTable.tenantId, tenantId), eq(myTable.id, id)));
drizzle.config.ts — migration confignpm run db:pushDATABASE_URL env variable