prisma 简介

  • prismopen in new window 是一个数据库管理工具,可以通过 prisma 来管理数据库,也可以通过 prisma 来管理数据库的 schema,也可以通过 prisma 来管理数据库的数据。

初始化项目

mkdir prisma-demo
cd prisma-demo

npm init -y
npm install prisma -D

npx prisma init
# 或者选择sqlite 作为默认数据库
npx prisma init --datasource-provider sqlite
  • 配置 schema.prisma 文件
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

// 用户模型
model user {
  id       String   @id @unique @default(uuid())
  // @map 作用是将数据库中的字段名映射为 user_name
  userName String   @unique @map("user_name")
  password String   @default("")
  nickName String   @default("") @map("nick_name")
  address  String   @default("")
  createAt DateTime @default(now()) @map("create_at")
  updateAt DateTime @default(now()) @map("update_at")
  post     post[]

  // @@map 作用是将数据库中的表名映射为 users
  @@map("users")
}

// 文章模型
model post {
  id       String   @id @unique @default(uuid())
  title    String   @default("")
  desc     String   @default("")
  content  String   @default("")
  createAt DateTime @default(now()) @map("create_at")
  updateAt DateTime @default(now()) @map("update_at")

  // 一篇文章只能属于一个用户
  user   user   @relation(fields: [userId], references: [id])
  // @map 作用是将数据库中的字段名映射为 user_id
  userId String @map("user_id")

  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @default(now()) @map("updated_at")
}
  • 生成数据库
npx prisma db push

# vscode 安装 sqlite 插件,可以查看数据库

# prisma 可视化 查看数据库 npx prisma studio
  • 连接数据库
// utils/db.js
const { PrismaClient } = require('@prisma/client')
const db = new PrismaClient()

// 连接数据库
db.$connect().catch((err) => {
  console.error(err)
  process.exit(1)
})

module.exports = db

数据库操作

  • 增加数据
// user.js, 然后执行 node user.js
const db = require('./utils/db')
// 创建用户
async function createUser() {
  try {
    await db.user.create({
      data: {
        userName: '小黑',
        password: '123456',
        nickName: '小黑',
      },
    })
    console.log('创建用户成功')
  } catch (error) {
    console.error(error)
  }
}

createUser()

// 查询用户
async function getUserList() {
  const userList = await db.user.findMany({
    select: {
      userName: true,
      nickName: true,
    },
  })
  console.log('查询用户列表成功', userList)
}

getUserList()

// 创建文章
async function createPost() {
  const user = await db.user.findFirst()
  try {
    await db.post.create({
      data: {
        title: '第一篇文章',
        content: '第一篇文章的内容',
        userId: user.id,
      },
    })
    console.log('创建文章成功')
  } catch (error) {
    console.error(error)
  }
}

createPost()
  • 关联数据查询
// user.js, 然后执行 node user.js
// 使用 select 关联查询, 或者 include 关联查询
// 查询文章
async function getPostList() {
  const postList = await db.post.findMany({
    select: {
      title: true,
      content: true,
      user: {
        select: {
          userName: true,
          nickName: true,
        },
      },
    },
    // include: {
    //   user: true,
    // },
  })
  console.log('查询文章列表成功', postList)
}

prisma 常用命令

  • npx prisma init 初始化项目

  • npx prisma migrate dev 生成数据库

  • npx prisma studio 可视化查看数据库

  • npx prisma migrate reset 重置数据库

  • npx prisma migrate deploy 部署数据库

  • npx prisma generate 生成 prisma client

  • npx prisma introspect 生成 prisma schema

  • npx prisma format 格式化 prisma schema

  • npx prisma migrate save --experimental 生成迁移文件

  • npx prisma migrate up --experimental 执行迁移文件

  • npx prisma migrate down --experimental 回滚迁移文件

  • npx prisma migrate resolve 解决迁移文件冲突

  • npx prisma migrate status 查看迁移文件状态

  • npx prisma db push 生成数据库

  • npx prisma db pull 从数据库生成 prisma schema

  • npx prisma db seed 生成数据库种子数据

  • npx prisma db seed --preview-feature 生成数据库种子数据

  • npx prisma db seed --preview-feature --reset 重置数据库种子数据

  • npx prisma db seed --preview-feature --reset --force 强制重置数据库种子数据

  • npx prisma migrate dev --name init 生成迁移文件

  • npx prisma migrate dev --name init --create-only 生成迁移文件

  • npx prisma migrate dev --name init --create-only --preview-feature 生成迁移文件

参考资料