Prisma 与 PostgreSQL 数据库教程
介绍
Prisma 是一个现代化的数据库工具链,包含 Prisma Client(自动生成的类型安全查询构建器)、Prisma Migrate(迁移系统)和 Prisma Studio(数据库 GUI)。本教程将介绍如何使用 Prisma 与 PostgreSQL 数据库。
前置条件
- Node.js 安装(建议 v14 或更高版本)
- PostgreSQL 数据库(本地或远程)
- 基本的 JavaScript/TypeScript 知识
安装与设置
- 创建新项目并初始化
mkdir prisma-postgres-tutorial
cd prisma-postgres-tutorial
npm init -y
npm install prisma typescript ts-node @types/node --save-dev
- 初始化 Prisma
npx prisma init
这会在项目中创建 prisma/schema.prisma 文件和 .env 文件。
配置 PostgreSQL 连接
- 修改
.env文件中的数据库连接字符串:
DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public"
例如本地 PostgreSQL:
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/prisma_tutorial?schema=public"
- 更新
schema.prisma文件中的datasource部分:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
定义数据模型
在 schema.prisma 中定义你的数据模型。例如:
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
迁移数据库
- 创建迁移:
npx prisma migrate dev --name init
这会:
- 创建迁移文件
- 应用到数据库
- 生成 Prisma Client
- 在生产环境中:
npx prisma migrate deploy
使用 Prisma Client
- 安装 Prisma Client:
npm install @prisma/client
- 创建 TypeScript 文件(如
index.ts):
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
// 创建用户
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
posts: {
create: { title: 'Hello World' },
},
},
})
console.log(user)
// 获取所有用户及其帖子
const users = await prisma.user.findMany({
include: {
posts: true,
},
})
console.dir(users, { depth: null })
}
main()
.catch((e) => {
throw e
})
.finally(async () => {
await prisma.$disconnect()
})
- 运行脚本:
npx ts-node index.ts
常用操作示例
创建记录
const newUser = await prisma.user.create({
data: {
name: 'Bob',
email: 'bob@prisma.io',
},
})
查询记录
// 获取所有用户
const allUsers = await prisma.user.findMany()
// 带条件的查询
const filteredPosts = await prisma.post.findMany({
where: {
published: true,
title: { contains: 'Prisma' },
},
})
更新记录
const updatedUser = await prisma.user.update({
where: { email: 'alice@prisma.io' },
data: { name: 'Alice Smith' },
})
删除记录
const deletedUser = await prisma.user.delete({
where: { email: 'bob@prisma.io' },
})
高级功能
事务处理
const [user, post] = await prisma.$transaction([
prisma.user.create({
data: {
name: 'Eve',
email: 'eve@prisma.io',
},
}),
prisma.post.create({
data: {
title: 'Prisma Transaction',
authorId: 1,
},
}),
])
原生 SQL 查询
const users = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1};`
聚合函数
const userCount = await prisma.user.count()
const postMetrics = await prisma.post.aggregate({
_avg: { viewCount: true },
_max: { viewCount: true },
_min: { viewCount: true },
})
使用 Prisma Studio
Prisma 提供了一个可视化界面来查看和编辑数据:
npx prisma studio
这将启动一个本地服务器(通常是 http://localhost:5555),你可以在浏览器中访问。
部署注意事项
- 在生产环境中,确保设置适当的连接池大小:
const prisma = new PrismaClient({
datasources: {
db: {
url: process.env.DATABASE_URL + "&connection_limit=20",
},
},
})
- 使用环境变量管理敏感信息
- 考虑使用 Prisma 的 Data Proxy 进行无服务器部署
总结
Prisma 为 PostgreSQL 提供了强大的类型安全接口,简化了数据库操作。通过定义数据模型,Prisma 可以自动生成客户端 API,支持迁移和可视化数据管理。