第 9 章:与数据库交互(Prisma + SQLite)
9.1 常见方案对比
| 方案 | 数据库类型 | 推荐程度 | 说明 |
|---|---|---|---|
| Prisma | 支持 MySQL / Postgres / SQLite 等 | ⭐⭐⭐⭐⭐ | 类型安全、自动生成模型 |
| Sequelize | 支持 MySQL / Postgres 等 | ⭐⭐⭐ | 更传统的 ORM,较重 |
| Mongoose | MongoDB 专用 | ⭐⭐⭐⭐ | 适合 NoSQL 项目 |
| 原生驱动 | 各数据库驱动 | ⭐⭐ | 灵活但需手动管理 SQL |
👉 推荐:Prisma(支持多种数据库 + 高开发效率)
9.2 安装 Prisma 并初始化数据库
🧱 安装依赖
npm install prisma --save-dev
npm install @prisma/client
🛠️ 初始化 Prisma
npx prisma init
项目中会生成:
prisma/
└── schema.prisma # 数据模型定义文件
.env # 数据库连接配置
🧩 配置数据库连接(以 SQLite 为例)
.env
DATABASE_URL="file:./dev.db"
9.3 定义数据模型
📄 prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
✅ 生成数据库和客户端
npx prisma migrate dev --name init
Prisma 会自动:
- 创建数据库(如 SQLite 的
dev.db文件) - 生成类型安全的客户端
9.4 使用 Prisma Client 查询数据
📄 lib/prisma.js
import { PrismaClient } from '@prisma/client';
const prisma = global.prisma || new PrismaClient();
if (process.env.NODE_ENV !== 'production') global.prisma = prisma;
export default prisma;
9.5 编写 API 接口
✅ 获取所有文章
📄 pages/api/posts/index.js
import prisma from '../../../lib/prisma';
export default async function handler(req, res) {
if (req.method === 'GET') {
const posts = await prisma.post.findMany({
include: { author: true },
});
res.status(200).json(posts);
}
}
✅ 创建一篇文章
📄 pages/api/posts/create.js
import prisma from '../../../lib/prisma';
export default async function handler(req, res) {
const { title, content, authorEmail } = req.body;
const post = await prisma.post.create({
data: {
title,
content,
author: {
connect: { email: authorEmail },
},
},
});
res.status(200).json(post);
}
9.6 在页面中调用 API
// pages/index.js
import { useEffect, useState } from 'react';
export default function Home() {
const [posts, setPosts] = useState([]);
useEffect(() => {
fetch('/api/posts')
.then((res) => res.json())
.then(setPosts);
}, []);
return (
<div>
<h1>文章列表</h1>
{posts.map((post) => (
<div key={post.id}>
<h2>{post.title}</h2>
<p>作者:{post.author?.name}</p>
</div>
))}
</div>
);
}
9.7 切换数据库(MySQL/PostgreSQL)
只需修改 .env 和 schema.prisma 的连接:
DATABASE_URL="mysql://user:password@localhost:3306/db_name"
datasource db {
provider = "mysql" // 或 "postgresql"
url = env("DATABASE_URL")
}
然后重新迁移:
npx prisma migrate dev --name init
✅ 小结
| 能力 | 示例 |
|---|---|
| 定义数据结构 | schema.prisma |
| 自动生成客户端 | npx prisma generate |
| 查询数据库 | prisma.model.findMany() |
| 服务端接口 | pages/api/xxx.js |
| 可切换数据库 | SQLite / MySQL / PostgreSQL |