Loading...
Loading...
Best practices for using Prisma ORM with Remix and Shopify (2025-2026 Edition). Covers schema design, migrations, and performance.
npx skill4agent add toilahuongg/google-antigravity-kit prisma-ormnpm install prisma --save-dev
npm install @prisma/client
npx prisma initschema.prismapostgresqlmysqlimproving-tracingdatasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
// Useful features for 2025+
previewFeatures = ["driverAdapters", "metrics"]
}
// Standard Shopify Session Model
model Session {
id String @id
shop String
state String
isOnline Boolean @default(false)
scope String?
expires DateTime?
accessToken String
userId BigInt?
}PrismaClient// app/db.server.ts
import { PrismaClient } from "@prisma/client";
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
export const prisma = globalForPrisma.prisma || new PrismaClient();
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;IntBigIntStringmodel Product {
id BigInt @id // Matches Shopify's ID
shop String
title String
// ...
@@index([shop]) // Always index by shop for multi-tenancy
}shopprisma db pushnpx prisma migrate dev --name init_tablesnpx prisma migrate deployfindManyselect// BAD: Fetches massive JSON blobs
const products = await prisma.product.findMany();
// GOOD
const products = await prisma.product.findMany({
select: { id: true, title: true }
});$transactionawait prisma.$transaction(async (tx) => {
const order = await tx.order.create({ ... });
await tx.lineItem.create({ ... });
});await prisma.user.upsert({
where: { id: 1 },
update: { email: "new@example.com" },
create: { id: 1, email: "new@example.com" },
});