Skip to main content

Getting Started with Prisma ORM: How to Seamlessly Integrate It into Your Express Application: A Step-by-Step Guide

When working with databases in Node.js applications, the process can often feel daunting. But what if I told you there’s a tool that makes working with databases not just simple but genuinely enjoyable? Let me introduce you to Prisma ORM.
Prisma ORM is like a breath of fresh air for developers who want to simplify database management in their Express applications. Whether you’re building a simple API or a complex web app, Prisma can make your life easier. In this blog, I’ll guide you through the process of integrating and using Prisma ORM in your Express application, sharing some personal insights and tips along the way. Let’s dive in!

What is Prisma, and Why Should You Care?

Before diving into the “how,” let’s quickly talk about the “why.” Prisma is an open-source ORM (Object-Relational Mapping) that makes working with databases easier and more intuitive. It allows you to interact with your database using a strongly typed API, reducing the risk of runtime errors. Plus, it supports multiple databases (PostgreSQL, MySQL, SQLite, and more) and provides tools like migrations and a slick database client.
I’ve personally found Prisma a lifesaver when scaling projects. Its type safety alone has saved me countless debugging hours, and the declarative schema makes database management feel like a breeze.
With Prisma, you get:

  • Type Safety: Automatically generated types for your database schema.
  • Simplified Queries: Write clean and readable database queries.
  • Powerful Migrations: Handle schema changes effortlessly.
  • Database Agnostic: Support for multiple databases.

What is Prisma ORM?

Prisma acts as a bridge between your database and your application. It simplifies CRUD (Create, Read, Update, Delete) operations by providing an abstraction layer that allows you to query your database in a declarative way.
Prisma consists of three key components:

  • Prisma Client: A type-safe database client for executing queries.
  • Prisma Migrate: A tool for managing schema migrations.
  • Prisma Studio: A visual database GUI for viewing and editing data.

Prerequisites

Before starting, ensure you have:

  • Node.js installed (v12.2.0 or later).
  • A package manager like npm or yarn.
  • A basic understanding of JavaScript/TypeScript and Express.js.
  • A database setup (PostgreSQL, MySQL, SQLite, etc.).

Step 1: Setting Up Your Express Project

To start using Prisma, you need an Express application. If you don’t already have one, let’s create it:

mkdir prisma-express-app
cd prisma-express-app
npm init -y
npm install express

Next, create a basic server.js file to set up your Express app:

const express = require('express');  
const app = express();  
app.use(express.json());  

app.get('/', (req, res) => {  
    res.send('Hello, Prisma!');  
});  

const PORT = process.env.PORT || 3000;  
app.listen(PORT, () => console.log(`Server is running on port ${PORT}`));  

Step 2: Install Prisma and Its Dependencies

To install Prisma, run the following command:

npm install prisma --save-dev
npm install @prisma/client

Next, initialize Prisma in your project:

npx prisma init

This creates a new prisma directory containing:

  • schema.prisma: The main Prisma schema file where you’ll define your database models.
  • .env: A file to store environment variables like your database connection URL.

Step 3: Configure the Database Connection

Open the schema.prisma file and configure your database connection. For example, if you’re using PostgreSQL, it might look like this:

datasource db {  
  provider = "postgresql"  
  url      = env("DATABASE_URL")  
}  

generator client {  
  provider = "prisma-client-js"  
}

Make sure to set your database URL in a .env file:

DATABASE_URL="postgresql://username:password@localhost:5432/mydb?schema=public"

Replace username, password, localhost, 5432, and mydb with your actual database credentials.

Step 4: Define Your Data Models

Let’s define a simple data model for a User entity. Update your schema.prisma file:

// Data model
model User {  
  id        Int      @id @default(autoincrement())  
  name      String  
  email     String   @unique  
  createdAt DateTime @default(now())  
}  

Save the file and run the following command to generate Prisma Client:

npx prisma generate

Step 5: Running Database Migrations

Now it’s time to apply your schema changes to the database to create the necessary tables:

npx prisma migrate dev --name init

This command:

  • Generates SQL migrations based on your schema.
  • Applies the migrations to your database.
  • Updates your Prisma client.

Step 6: Using Prisma in Your Express App

With Prisma Client generated, you can now use it in your Express app. Let’s create a simple CRUD API for the User model.
First, import Prisma Client in your server.js file:

const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

Next, add routes to handle CRUD operations:

// Create a new user
app.post('/users', async (req, res) => {  
    const { name, email } = req.body;  
    try {  
        const user = await prisma.user.create({  
            data: { name, email },  
        });  
        res.json(user);  
    } catch (error) {  
        res.status(400).json({ error: error.message });  
    }  
});

// Get all users
app.get('/users', async (req, res) => {
  const users = await prisma.user.findMany();
  res.status(200).json(users);
});

// Update a user  
app.put('/users/:id', async (req, res) => {  
    const { id } = req.params;  
    const { name, email } = req.body;  
    try {  
        const updatedUser = await prisma.user.update({  
            where: { id: parseInt(id) },  
            data: { name, email },  
        });  
        res.json(updatedUser);  
    } catch (error) {  
        res.status(400).json({ error: error.message });  
    }  
});

// Delete a user  
app.delete('/users/:id', async (req, res) => {  
    const { id } = req.params;  
    try {  
        await prisma.user.delete({  
            where: { id: parseInt(id) },  
        });  
        res.json({ message: 'User deleted successfully' });  
    } catch (error) {  
        res.status(400).json({ error: error.message });  
    }  
});

Step 7: Testing Your API

Start your Express server:

node server.js

Use a tool like Postman or curl to test your endpoints. You should be able to create, read, update, and delete users in your database. For example:

  • POST /users to create a user with a JSON body: { “name”: “John Doe”, “email”: “[email protected]” }
  • GET /users to retrieve all users.
  • PUT /users/:id to update a user.
  • DELETE /users/:id to delete a user.

Step 8: Prisma Studio (Optional)

Prisma provides a GUI called Prisma Studio to explore and edit your database. Launch it with:

npx prisma studio

Conclusion

Integrating Prisma ORM into an Express application is a game-changer for modern backend development. It simplifies database interactions, ensures type safety, and boosts developer productivity. It’s like having a personal assistant for your database – handling queries, and even catching potential issues before they become problems. Honestly, I’ve found it makes backend development so much smoother and more enjoyable and it gave me so much confidence in my codebase.
When I first started using Prisma, what stood out immediately was how effortlessly it simplified database interactions. Writing complex queries that used to take multiple lines of code was suddenly as easy as calling a method. The type safety Prisma offers saved me countless hours by catching errors early.
By following the steps outlined in this blog, you’ll have a fully functional Express app with Prisma ORM up and running in no time. Trust me, once you dive deeper, you’ll realize just how powerful and flexible Prisma can be.
But don’t stop here! Explore Prisma’s advanced features like relations, raw SQL queries, and middlewares to unlock its full potential. Prisma keeps surprising me with how much it can do. Once you dive in, you’ll probably find yourself, like me, wondering how you ever managed backend development without it!

Explore Other Resources

February 14, 2024 in Case Studies, Product Engineering

CLAS – A system that integrates Hubspot, Stripe, Canvas

About This Project Ziplines is a series A-funded ed-tech startup with one goal—helping students attain the real-world skills they need to thrive in careers they love by partnering with universities.…
Read More
September 9, 2024 in blog

Gentle Introduction to Elasticsearch

Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents. Elasticsearch is developed…
Read More
May 17, 2024 in blog

How to fix “OAuth out-of-band (OOB) flow will be deprecated” error for Google apps API access.

Migrate your OAuth out-of-band flow to an alternative method. Google has announced that they will block the usage of OOB based OAuth starting from January 31, 2023. This has forced…
Read More