Hey everyone! If you’ve ever built an application—whether it’s a web app, Android app, or desktop app—you’ve likely needed a database. Gone are the days when developers wrote raw SQL queries manually and worked directly with database connectors. Instead, Object-Relational Mappers (ORMs) and Object-Document Mappers (ODMs) have taken over, making database interactions much more efficient and maintainable.
In my search for the best ORM, I came across Prisma, and I must say—it’s one of the best! Before choosing Prisma, I explored SQLAlchemy and a few others, but they weren’t as flexible. One major downside of SQLAlchemy is that you need to define data models and data classes manually. Plus, dynamically adding new fields at runtime isn’t straightforward. That’s where Prisma shines!
Why Choose Prisma? 🤔
Automatic Model Generation – Define your schema once, and Prisma takes care of the rest. No need to manually create model classes.
Multi-Language Support – Works seamlessly with Node.js, Next.js, Python (FastAPI, Django, Flask), and more.
Type Safety – Provides full TypeScript support for safer queries.
Flexible and Scalable – Prisma is not just an ORM; it acts as a database toolkit supporting migrations, queries, and relations.
Great Performance – Optimized for modern databases like PostgreSQL, MySQL, SQLite, and MongoDB.
I’ve personally used Prisma with Python (FastAPI backend) and Next.js backend, and it was an amazing experience!
Setting Up Prisma with Next.js
Let’s go through the basic setup for a Next.js + Prisma + PostgreSQL project.
Step 1: Install Dependencies
npm <span>install</span> @prisma/clientnpm <span>install</span> <span>--save-dev</span> prismanpm <span>install</span> @prisma/client npm <span>install</span> <span>--save-dev</span> prismanpm install @prisma/client npm install --save-dev prisma
Enter fullscreen mode Exit fullscreen mode
Step 2: Initialize Prisma
npx prisma initnpx prisma initnpx prisma init
Enter fullscreen mode Exit fullscreen mode
This will create a prisma/schema.prisma
file where you can define your database schema.
Step 3: Define Your Schema
Edit the prisma/schema.prisma
file to define your models:
model User {id Int @id @default(autoincrement())name Stringemail String @uniqueposts Post[]}model Post {id Int @id @default(autoincrement())title Stringcontent String?author User @relation(fields: [authorId], references: [id])authorId Int}model User { id Int @id @default(autoincrement()) name String email String @unique posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? author User @relation(fields: [authorId], references: [id]) authorId Int }model User { id Int @id @default(autoincrement()) name String email String @unique posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? author User @relation(fields: [authorId], references: [id]) authorId Int }
Enter fullscreen mode Exit fullscreen mode
Step 4: Run Migrations
npx prisma migrate dev <span>--name</span> initnpx prisma migrate dev <span>--name</span> initnpx prisma migrate dev --name init
Enter fullscreen mode Exit fullscreen mode
Step 5: Use Prisma in Your API
Create a file lib/prisma.ts
:
<span>import</span> <span>{</span> <span>PrismaClient</span> <span>}</span> <span>from</span> <span>'</span><span>@prisma/client</span><span>'</span><span>;</span><span>const</span> <span>prisma</span> <span>=</span> <span>new</span> <span>PrismaClient</span><span>();</span><span>export</span> <span>default</span> <span>prisma</span><span>;</span><span>import</span> <span>{</span> <span>PrismaClient</span> <span>}</span> <span>from</span> <span>'</span><span>@prisma/client</span><span>'</span><span>;</span> <span>const</span> <span>prisma</span> <span>=</span> <span>new</span> <span>PrismaClient</span><span>();</span> <span>export</span> <span>default</span> <span>prisma</span><span>;</span>import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export default prisma;
Enter fullscreen mode Exit fullscreen mode
Use it in an API route:
<span>import</span> <span>prisma</span> <span>from</span> <span>'</span><span>../../lib/prisma</span><span>'</span><span>;</span><span>export</span> <span>default</span> <span>async</span> <span>function</span> <span>handler</span><span>(</span><span>req</span><span>,</span> <span>res</span><span>)</span> <span>{</span><span>const</span> <span>users</span> <span>=</span> <span>await</span> <span>prisma</span><span>.</span><span>user</span><span>.</span><span>findMany</span><span>();</span><span>res</span><span>.</span><span>json</span><span>(</span><span>users</span><span>);</span><span>}</span><span>import</span> <span>prisma</span> <span>from</span> <span>'</span><span>../../lib/prisma</span><span>'</span><span>;</span> <span>export</span> <span>default</span> <span>async</span> <span>function</span> <span>handler</span><span>(</span><span>req</span><span>,</span> <span>res</span><span>)</span> <span>{</span> <span>const</span> <span>users</span> <span>=</span> <span>await</span> <span>prisma</span><span>.</span><span>user</span><span>.</span><span>findMany</span><span>();</span> <span>res</span><span>.</span><span>json</span><span>(</span><span>users</span><span>);</span> <span>}</span>import prisma from '../../lib/prisma'; export default async function handler(req, res) { const users = await prisma.user.findMany(); res.json(users); }
Enter fullscreen mode Exit fullscreen mode
Setting Up Prisma with FastAPI
Step 1: Install Prisma for Python
pip <span>install </span>prismapip <span>install </span>prismapip install prisma
Enter fullscreen mode Exit fullscreen mode
Step 2: Initialize Prisma in Your FastAPI Project
prisma initprisma initprisma init
Enter fullscreen mode Exit fullscreen mode
Step 3: Define Your Schema (prisma/schema.prisma
)
model User {id Int @id @default(autoincrement())name Stringemail String @unique}model User { id Int @id @default(autoincrement()) name String email String @unique }model User { id Int @id @default(autoincrement()) name String email String @unique }
Enter fullscreen mode Exit fullscreen mode
Step 4: Generate Prisma Client
prisma generateprisma generateprisma generate
Enter fullscreen mode Exit fullscreen mode
Step 5: Use Prisma in FastAPI
<span>from</span> <span>prisma</span> <span>import</span> <span>Client</span><span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span><span>app</span> <span>=</span> <span>FastAPI</span><span>()</span><span>prisma</span> <span>=</span> <span>Client</span><span>()</span><span>@app.get</span><span>(</span><span>"</span><span>/users</span><span>"</span><span>)</span><span>async</span> <span>def</span> <span>get_users</span><span>():</span><span>if</span> <span>not</span> <span>db</span><span>.</span><span>is_connected</span><span>():</span><span>await</span> <span>db</span><span>.</span><span>connect</span><span>()</span><span>users</span> <span>=</span> <span>await</span> <span>prisma</span><span>.</span><span>user</span><span>.</span><span>find_many</span><span>()</span><span>return</span> <span>users</span><span>from</span> <span>prisma</span> <span>import</span> <span>Client</span> <span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span> <span>app</span> <span>=</span> <span>FastAPI</span><span>()</span> <span>prisma</span> <span>=</span> <span>Client</span><span>()</span> <span>@app.get</span><span>(</span><span>"</span><span>/users</span><span>"</span><span>)</span> <span>async</span> <span>def</span> <span>get_users</span><span>():</span> <span>if</span> <span>not</span> <span>db</span><span>.</span><span>is_connected</span><span>():</span> <span>await</span> <span>db</span><span>.</span><span>connect</span><span>()</span> <span>users</span> <span>=</span> <span>await</span> <span>prisma</span><span>.</span><span>user</span><span>.</span><span>find_many</span><span>()</span> <span>return</span> <span>users</span>from prisma import Client from fastapi import FastAPI app = FastAPI() prisma = Client() @app.get("/users") async def get_users(): if not db.is_connected(): await db.connect() users = await prisma.user.find_many() return users
Enter fullscreen mode Exit fullscreen mode
Conclusion
If you’re looking for an ORM that is flexible, efficient, and easy to use, Prisma is a fantastic choice! It works seamlessly with both JavaScript/TypeScript and Python, making it a great fit for full-stack applications.
Give Prisma a try in your next project and let me know your thoughts! Have you used any other ORMs that you liked? Drop a comment below!
暂无评论内容