Привет! Работая над бэкенд-проектом, я столкнулся с простой, но досадной проблемой — я не смог найти понятное и полное руководство по подключению MySQL к простому бэкенд-проекту .
Большинство обучающих материалов либо:
Прежде чем начать — небольшое замечание.
Prisma — это не просто ещё один ORM. Он предоставляет следующие возможности:
Запустите его:
npm run start
Инициализация Prisma:
npx prisma init
Рекомендация: всегда используйте npx prisma вместо глобального интерфейса командной строки.
По умолчанию Prisma использует PostgreSQL или SQLite. Переключимся на MySQL. Теперь откроем файл .env:
DATABASE_URL="mysql://root
assword@localhost:3306/my_db"
DATABASE_USER="root"
DATABASE_PASSWORD="password"
DATABASE_NAME="my_db"
DATABASE_HOST="localhost"
DATABASE_PORT=3306
А теперь откройте файл schema.prisma:
клиент генератора {
provider = "prisma-client"
output = "../generated/prisma"
moduleFormat = "cjs"
}
база данных источника данных {
provider = "mysql"
}
Это стандартный формат подключения к MySQL в Prisma.
npx prisma generate
Prisma генерирует типобезопасный клиент на основе вашей схемы.
Это означает, что ваши запросы проверяются на этапе компиляции.
импортировать "dotenv/config";
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import { PrismaClient } from "../generated/prisma/client";
import { Injectable } from "@nestjs/common";
@Injectable()
export class PrismaService extends PrismaClient{
конструктор(){
const adapter = new PrismaMariaDb({
хост: process.env.DATABASE_HOST,
пользователь: process.env.DATABASE_USER,
пароль: process.env.DATABASE_PASSWORD,
база данных: process.env.DATABASE_NAME,
connectionLimit: 5,
});
супер({адаптер})
}
}
Почему это необходимо:
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Module({
поставщики: [PrismaService],
экспорт: [PrismaService],
})
export class PrismaModule {}
Мы напишем наш сервис в конструкторе. Я покажу вам, как его использовать на примере:
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'prisma/prisma.service';
import { TodoDTO } from './dto/todo.dto';
@Injectable()
export class TodoService {
constructor(private readonly todoService: PrismaService){} //это обязательно
public getOne(id:number){
return this.todoService.todo.findFirst(
{
где: {id}
}
)
}
public getAll(){
return this.todoService.todo.findMany()
}
public create(data: TodoDTO){
return this.todoService.todo.create({data: data})
}
public upgrade(id: number, data: TodoDTO){
return this.todoService.todo.update({
где: {id},
данные: данные
})
}
public delete(id:number){
return this.todoService.todo.delete(
{
где: {id}
}
)
}
}
Вот как обычно используется Prisma в сервисах NestJS.
npx prisma migrate dev --name initnpx prisma generate
В монорепозитории:
Кроме того, специально для вас я включил справочную карточку, чтобы вы могли запомнить и сохранить ее для дальнейшего использования. В этой карточке я собрал все материалы, чтобы облегчить вам задачу.
Если это руководство вам помогло — поддержите публикацию.
Спасибо за внимание!
Большинство обучающих материалов либо:
- пропустить важные шаги
- предполагать слишком много предварительных знаний
- или не объясняют, почему всё работает именно так.
- Как подключиться к MySQL с помощью NestJS + Prisma
- как это работает под капотом
- и как использовать его в монорепозитории.
Почему Prisma?
Прежде чем начать — небольшое замечание.Prisma — это не просто ещё один ORM. Он предоставляет следующие возможности:
- типобезопасные запросы к базе данных
- автоматически сгенерированный клиент на основе схемы
- Более удобный интерфейс для разработчиков, чем у классических ORM, таких как TypeORM.
Создайте проект NestJS.
npm i -g @nestjs/clinest new my-backend-project cd my-backend-project npm installЗапустите его:
npm run start
Установите Prisma
npm install prisma --save-devnpm install @prisma/clientИнициализация Prisma:
npx prisma init
После инициализации вы получите:
- schema.prisma — схема базы данных и подключение
- .env — переменные среды
- prisma.config.ts — конфигурация проекта
Настройка MySQL
По умолчанию Prisma использует PostgreSQL или SQLite. Переключимся на MySQL. Теперь откроем файл .env:DATABASE_URL="mysql://root
DATABASE_USER="root"
DATABASE_PASSWORD="password"
DATABASE_NAME="my_db"
DATABASE_HOST="localhost"
DATABASE_PORT=3306
А теперь откройте файл schema.prisma:
клиент генератора {
provider = "prisma-client"
output = "../generated/prisma"
moduleFormat = "cjs"
}
база данных источника данных {
provider = "mysql"
}
Это стандартный формат подключения к MySQL в Prisma.
Создать клиент Prisma
npx prisma generateЭто означает, что ваши запросы проверяются на этапе компиляции.
Создать PrismaService
импортировать "dotenv/config";import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import { PrismaClient } from "../generated/prisma/client";
import { Injectable } from "@nestjs/common";
@Injectable()
export class PrismaService extends PrismaClient{
конструктор(){
const adapter = new PrismaMariaDb({
хост: process.env.DATABASE_HOST,
пользователь: process.env.DATABASE_USER,
пароль: process.env.DATABASE_PASSWORD,
база данных: process.env.DATABASE_NAME,
connectionLimit: 5,
});
супер({адаптер})
}
}
- интегрирует Prisma в жизненный цикл Nest.
- обеспечивает надлежащую обработку соединений
- предотвращает утечки памяти в производственной среде
Создать PrismaModule
import { Module } from '@nestjs/common';import { PrismaService } from './prisma.service';
@Module({
поставщики: [PrismaService],
экспорт: [PrismaService],
})
export class PrismaModule {}
Используйте Prisma в своей работе
Мы напишем наш сервис в конструкторе. Я покажу вам, как его использовать на примере:import { Injectable } from '@nestjs/common';
import { PrismaService } from 'prisma/prisma.service';
import { TodoDTO } from './dto/todo.dto';
@Injectable()
export class TodoService {
constructor(private readonly todoService: PrismaService){} //это обязательно
public getOne(id:number){
return this.todoService.todo.findFirst(
{
где: {id}
}
)
}
public getAll(){
return this.todoService.todo.findMany()
}
public create(data: TodoDTO){
return this.todoService.todo.create({data: data})
}
public upgrade(id: number, data: TodoDTO){
return this.todoService.todo.update({
где: {id},
данные: данные
})
}
public delete(id:number){
return this.todoService.todo.delete(
{
где: {id}
}
)
}
}
Выполнить миграции
npx prisma migrate dev --name initnpx prisma generate
Настройка монорепозитория (краткое объяснение)
В монорепозитории:- Разместите Prisma в отдельном пакете/библиотеке.
- Экспорт только услуг (не исходного клиента)
- повторное использование в разных приложениях
- изолировать логику базы данных
- упростить масштабирование
- Переключение баз данных становится проще.
Бонус — Официальные документы
Кроме того, специально для вас я включил справочную карточку, чтобы вы могли запомнить и сохранить ее для дальнейшего использования. В этой карточке я собрал все материалы, чтобы облегчить вам задачу.
Если это руководство вам помогло — поддержите публикацию.
Спасибо за внимание!