第 9 章:与数据库交互(Prisma + SQLite)

163 阅读2分钟

第 9 章:与数据库交互(Prisma + SQLite)


9.1 常见方案对比

方案数据库类型推荐程度说明
Prisma支持 MySQL / Postgres / SQLite 等⭐⭐⭐⭐⭐类型安全、自动生成模型
Sequelize支持 MySQL / Postgres 等⭐⭐⭐更传统的 ORM,较重
MongooseMongoDB 专用⭐⭐⭐⭐适合 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)

只需修改 .envschema.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