Prisma 与 PostgreSQL 数据库教程

366 阅读2分钟

Prisma 与 PostgreSQL 数据库教程

介绍

Prisma 是一个现代化的数据库工具链,包含 Prisma Client(自动生成的类型安全查询构建器)、Prisma Migrate(迁移系统)和 Prisma Studio(数据库 GUI)。本教程将介绍如何使用 Prisma 与 PostgreSQL 数据库。

前置条件

  • Node.js 安装(建议 v14 或更高版本)
  • PostgreSQL 数据库(本地或远程)
  • 基本的 JavaScript/TypeScript 知识

安装与设置

  1. 创建新项目并初始化
mkdir prisma-postgres-tutorial
cd prisma-postgres-tutorial
npm init -y
npm install prisma typescript ts-node @types/node --save-dev
  1. 初始化 Prisma
npx prisma init

这会在项目中创建 prisma/schema.prisma 文件和 .env 文件。

配置 PostgreSQL 连接

  1. 修改 .env 文件中的数据库连接字符串:
DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public"

例如本地 PostgreSQL:

DATABASE_URL="postgresql://postgres:postgres@localhost:5432/prisma_tutorial?schema=public"
  1. 更新 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
}

迁移数据库

  1. 创建迁移:
npx prisma migrate dev --name init

这会:

  • 创建迁移文件
  • 应用到数据库
  • 生成 Prisma Client
  1. 在生产环境中:
npx prisma migrate deploy

使用 Prisma Client

  1. 安装 Prisma Client:
npm install @prisma/client
  1. 创建 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()
  })
  1. 运行脚本:
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),你可以在浏览器中访问。

部署注意事项

  1. 在生产环境中,确保设置适当的连接池大小:
const prisma = new PrismaClient({
  datasources: {
    db: {
      url: process.env.DATABASE_URL + "&connection_limit=20",
    },
  },
})
  1. 使用环境变量管理敏感信息
  2. 考虑使用 Prisma 的 Data Proxy 进行无服务器部署

总结

Prisma 为 PostgreSQL 提供了强大的类型安全接口,简化了数据库操作。通过定义数据模型,Prisma 可以自动生成客户端 API,支持迁移和可视化数据管理。