1. 创建 NestJS 项目
如果你还没有创建一个 NestJS 项目,先用以下命令创建:
bash
复制代码
nest new nest-prisma-docker
然后进入到你的项目目录:
bash
复制代码
cd nest-prisma-docker
2. 安装 Prisma 和相关依赖
在你的 NestJS 项目中,安装 Prisma 以及 Prisma CLI 和 PostgreSQL 适配器:
bash
复制代码
npm install @prisma/client
npm install prisma --save-dev
3. 配置 Docker 数据库
我们将使用 Docker 启动 PostgreSQL 数据库。首先,确保你已经安装了 Docker,并且 Docker 守护进程正在运行。
在项目根目录下创建一个 docker-compose.yml 文件,配置 PostgreSQL 服务:
yaml
复制代码
version: '3.8'
services:
db:
image: postgres:13
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password123
POSTGRES_DB: nest
ports:
- "5432:5432"
networks:
- nest-network
networks:
nest-network:
driver: bridge
然后启动数据库容器:
bash
复制代码
docker-compose up -d
这样就启动了一个 PostgreSQL 数据库,你可以通过 localhost:5432 访问它,用户名是 postgres,密码是 password123,数据库名是 nest。
4. 初始化 Prisma
接下来,初始化 Prisma 配置文件。在项目根目录运行以下命令:
bash
复制代码
npx prisma init
这会在项目中创建一个 prisma 文件夹,并在其中生成一个 schema.prisma 文件。你可以在 schema.prisma 文件中配置数据库连接。
5. 配置 Prisma 数据源
编辑 prisma/schema.prisma 文件,配置连接到 Docker PostgreSQL 数据库:
prisma
复制代码
datasource db {
provider = "postgresql"
url = env("DATABASE_URL") // 从环境变量获取数据库连接字符串
}
generator client {
provider = "prisma-client-js"
}
6. 配置 .env 文件
在根目录下创建一个 .env 文件,配置数据库的连接字符串:
bash
复制代码
DATABASE_URL="postgresql://postgres:password123@localhost:5432/nest?schema=public"
确保 DATABASE_URL 中的用户名、密码、数据库名、主机和端口与 docker-compose.yml 中的配置相匹配。
7. 创建模型
在 prisma/schema.prisma 文件中,定义你的数据模型。例如,我们创建一个简单的 User 模型:
prisma
复制代码
model User {
id Int @id @default(autoincrement())
email String @unique
password String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
8. 生成 Prisma 客户端
在终端运行以下命令生成 Prisma 客户端:
bash
复制代码
npx prisma generate
这将根据 schema.prisma 中的定义生成数据库客户端。
9. 运行数据库迁移
使用 Prisma 迁移功能来同步数据库架构。运行以下命令来生成和应用迁移:
bash
复制代码
npx prisma migrate dev --name init
此命令会根据模型创建一个数据库迁移,并应用它。它还会自动生成相应的 SQL 文件。
10. 在 NestJS 中使用 Prisma
现在,创建一个 Prisma 服务,用于在 NestJS 中与数据库交互。
创建 src/prisma/prisma.service.ts 文件,并添加以下内容:
typescript
复制代码
import { Injectable } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient {
constructor() {
super();
}
}
11. 在模块中引入 Prisma 服务
在 src/app.module.ts 中引入并使用 Prisma 服务:
typescript
复制代码
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma/prisma.service';
@Module({
imports: [],
controllers: [],
providers: [PrismaService],
})
export class AppModule {}
12. 使用 Prisma 服务
现在,你可以在你的服务中使用 Prisma 客户端与数据库进行交互。例如,创建一个 UserService 来操作用户数据。
创建 src/user/user.service.ts 文件,并添加以下内容:
typescript
复制代码
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';
@Injectable()
export class UserService {
constructor(private prisma: PrismaService) {}
async createUser(email: string, password: string) {
return await this.prisma.user.create({
data: {
email,
password,
},
});
}
async getUsers() {
return await this.prisma.user.findMany();
}
}
13. 控制器中使用服务
最后,创建一个控制器来处理用户的 API 请求。创建 src/user/user.controller.ts 文件:
typescript
复制代码
import { Controller, Post, Body, Get } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('users')
export class UserController {
constructor(private userService: UserService) {}
@Post()
createUser(@Body() body: { email: string; password: string }) {
return this.userService.createUser(body.email, body.password);
}
@Get()
getUsers() {
return this.userService.getUsers();
}
}
14. 模块化
确保在 src/user/user.module.ts 中注册服务和控制器:
typescript
复制代码
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { PrismaService } from 'src/prisma/prisma.service';
@Module({
controllers: [UserController],
providers: [UserService, PrismaService],
})
export class UserModule {}
并将 UserModule 导入到 src/app.module.ts 中:
typescript
复制代码
import { Module } from '@nestjs/common';
import { UserModule } from './user/user.module';
@Module({
imports: [UserModule],
controllers: [],
providers: [],
})
export class AppModule {}
15. 运行项目
现在,确保一切设置正确,可以启动你的 NestJS 应用:
bash
复制代码
npm run start
16. 访问接口
你可以通过 Postman 或其他 HTTP 客户端测试以下 API:
-
POST /users:创建一个新用户
-
请求体:
json 复制代码 { "email": "user@example.com", "password": "password123" }
-
-
GET /users:获取所有用户列表。