Does NestJS Work With MySQL?

Fully CompatibleLast verified: 2026-02-26

NestJS and MySQL work together seamlessly via TypeORM or Prisma, making this a production-ready combination for enterprise Node.js applications.

Quick Facts

Compatibility
full
Setup Difficulty
Easy
Official Integration
Yes ✓
Confidence
high
Minimum Versions
NestJS: 8.0.0
MySQL: 5.7

How NestJS Works With MySQL

NestJS integrates with MySQL through database abstraction layers, primarily TypeORM (the most common choice) or Prisma. TypeORM is tightly integrated into NestJS via @nestjs/typeorm, providing decorators for entity definitions, repositories, and automatic dependency injection. This means you define your MySQL tables as TypeScript classes with @Entity() decorators, then inject repositories into services for type-safe database operations. The developer experience is exceptional—migrations, relationships, and transactions feel native to the framework. Prisma offers an alternative with a modern schema-driven approach and superior DX for many teams. Both ORMs handle connection pooling, query building, and MySQL-specific features like JSON columns. Architecture-wise, you'll structure your app with entities, repositories, services, and controllers following NestJS patterns, keeping data access logic cleanly separated. MySQL 5.7+ is production-ready, though 8.0+ is recommended for better performance and features.

Best Use Cases

→RESTful APIs with complex relational data (users, posts, comments with proper foreign keys)
→Enterprise backends requiring ACID transactions and data consistency
→Multi-tenant SaaS applications leveraging MySQL's reliability and NestJS's modular architecture
→Real-time applications with WebSockets where MySQL provides persistent state backing in-memory operations

Quick Setup

bash
npm install @nestjs/typeorm typeorm mysql2
typescript
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UserService } from './user.service';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'password',
      database: 'myapp',
      entities: [User],
      synchronize: true,
    }),
    TypeOrmModule.forFeature([User]),
  ],
  providers: [UserService],
})
export class AppModule {}

// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()
  name: string;
}

// user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  async findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }
}

Known Issues & Gotchas

critical

Connection pool exhaustion under load if not configured properly

Fix: Set appropriate pool size (default 10) in TypeOrmModule config and monitor active connections in production

warning

N+1 query problems when loading related entities without proper eager loading

Fix: Use leftJoinAndSelect() in QueryBuilder or load relations explicitly; enable query logging in development to catch issues

warning

Type mismatches between TypeScript and MySQL column types (especially dates, decimals)

Fix: Use @Column() type hints explicitly (e.g., @Column('decimal', { precision: 10, scale: 2 })) and leverage transformer option for custom serialization

info

Timezone handling—MySQL stores UTC but Node.js may misinterpret datetime without explicit config

Fix: Always use serverTimezone='+00:00' in connection config and store timestamps as UTC

Alternatives

  • •NestJS + PostgreSQL: More advanced features (JSONB, arrays), slightly better performance for complex queries
  • •NestJS + MongoDB: Document-oriented, better for unstructured data, trades ACID guarantees for schema flexibility
  • •Express + Sequelize + MySQL: Lighter alternative without NestJS overhead, less opinionated structure

Resources

Related Compatibility Guides

Explore more compatibility guides