Back to blog
2024年4月24日
3 min read

prisma

prisma基础

一个简单的案例,链接mysql

1. 创建项目

创建一个项目名为prisma-demo,并初始化和下载依赖

npm init -y
npm install prisma typescript ts-node @types/node --save-dev

创建一个tsconfig.json文件,并向其中添加以下配置:

{
  "compilerOptions": {
    "sourceMap": true,
    "outDir": "dist",
    "strict": true,
    "lib": ["esnext"],
    "esModuleInterop": true
  }
}

通过npx 来调用prisma cli

npx prisma

通过以下命令来创建Prisma schema 文件来设置Prisma 项目

npx prisma init

这个命令创建了一个名为prisma的新目录,其中包含一个名为schema.prisma的文件和一个位于项目根目录中的.env文件schema.prisma包含prisma模式以及数据库连接和prisma客户端生成器。 .env是一个dotenv用于定义环境变量的文件(用于数据库连接)

链接数据库

Prisma/schema.prisma文件修改如下

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

datasource db {
  provider = "mysql" // 修改为mysql,即是那个数据库
  url      = env("DATABASE_URL")
}

.env 中链接数据库

DATABASE_URL="mysql://root:mysql密码@localhost:3306/数据库名"
// 案例
DATABASE_URL="mysql://root:password@localhost:3306/mydb"

使用 Prisma 迁移

prisma/schema.prisma 文件中添加如下案例


model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
}

要将数据模型映射到数据库架构,需要使用prisma migrateCLI命令

npx prisma migrate dev --name init

上面命令为2项:

  1. 为这次迁移创建一个心的sql 迁移文件
  2. 对数据库运行sql迁移文件

安装prisma client

要开始使用Prisma Client,需要安装@prisma/client

npm install @prisma/client

注意,安装命令会自动调用prisma generate,它会读取prisma模式并生成一个适合您的模型的prisma Client版本。

以后每当您对 Prisma 架构进行更改时,您都需要手动调用prisma generate以适应 Prisma 客户端 API 中的更改。

npx prisma generate

数据库查询

创建一个index.ts文件

import {PrismaClient} from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
    
    await prisma.user.create({ // 插入数据
        data: {
            name: '李四', // 数据库表中对应的字段
            email: 'test@qq.com'
        }
    })
    const user = await prisma.user.findMany() // 查询数据库所有数据
    console.log(user)
}

main()
  .catch((e) => {
    throw e
  })
  .finally(async () => {
    await prisma.$disconnect() // 执行完后关闭服务
  })

执行以下命令,插入数据和查询数据

npx ts-node index.ts

表关联案例

模型类型

model Post {
  id Int @id @default(autoincrement()) // 默认值和自增,还有就是ID
  createAt DateTime @default(now()) // 时间类型,默认为现在时间
  updateAt DateTime @updatedAt // 更新时间
  title String @db.VarChar(255) // 字符串长度
  content String? // ?表示可以不填
  published Boolean @default(false)
  authorId Int // 一个外链
  author User @relation(fields: [authorId],references: [id]) // 设置外链
}

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique // 唯一性
  name    String?
  posts Post[] // 表示一个用户有多篇文章
}

插入数据

    await prisma.user.create({
        data: {
            name: '王五',
            email: 'test13@qq.com',
            posts: { // 外表的数据
                create: { // 表示创建以下属性数据
                    title: '标题rrr',
                    content:'内容222'
                }
            }
        }
    })

查询关联数据

   // 查询所有
    const user = await prisma.user.findMany({
        include: { // 包含返回外链内容
            posts: true
          },
    })
    // 输出的user 是一个数组并包含posts
    

条件查询

const user1 = await prisma.user.findMany({
        where: { // 查询条件
            name: '王五' // 查询name === '王五'的数据
          },
    })
    
    // 查询name === '王五' 并且返回包含posts数据
    const user1 = await prisma.user.findMany({
        where: { // 查询条件
            name: '王五'
        },
        include: {
            posts: true
        }
    })
    console.log(user1)

更新数据

// 修改ID==1的人名称    
let user = await prisma.user.update({
        where: { // 条件
            id: 1
        },
        data: { // 要修改的数据
            name: '旺财'
        }
    })

    console.log(user) // 输出修改后的数据

删除

// 删除ID为1的数据    
let postData = await prisma.post.delete({
        where: {
            id: 1
        }
    })
    console.log(postData)