CodeSnippet
Prisma

Prisma

Prisma 速查表

Prisma 是一个开源的数据库工具,可以方便地连接数据库、生成客户端、操作数据库等。是 Node.js 和 TypeScript 的首选 ORM。ORM 是 Object Relational Mapping 的缩写,意思是对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。ORM 通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

1. 安装

npm install prisma

2. 初始化

npx prisma init

3. 生成客户端

npx prisma generate

4. 生成数据库

npx prisma migrate dev --name init

启动 Studio

Prisma Studio 是一个可视化的数据库管理工具,可以方便地查看、编辑数据库中的数据。

npx prisma studio

prisma.schema

用于定义数据库模型

1. 数据源

选择数据库的种类,以及连接数据库的 URL

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

此外还支持 mysqlpostgresqlsqlserver 等数据库如下:

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
datasource db {
  provider = "sqlserver"
  url      = env("DATABASE_URL")
}

2. 模型

定义数据库中的表

model User {
  id    Int      @id @default(autoincrement())
  email String   @unique
  name  String?
  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
}

@id 表示主键,@default(autoincrement()) 表示自增

@unique 表示唯一

@relation 表示外键

此外,还支持 @map@default@updatedAt@createdAt@ignore@comment@db@index 等,分别表示数据库中的字段名、默认值、更新时间、创建时间、忽略、注释、数据库名、索引等。

详细的字段类型可以参考 Prisma Schema Reference (opens in a new tab)

常见数据类型

1. String

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

2. Int

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

3. Float

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

4. Boolean

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

5. DateTime

model User {
  id    Int      @id @default(autoincrement())
  email String   @unique
  createdAt DateTime @default(now())
}

6. Json

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

7. Enum

enum Role {
  USER
  ADMIN
}
 
model User {
  id    Int      @id @default(autoincrement())
  email String   @unique
  role  Role     @default(USER)
}

更多的数据类型可以参考 Prisma Schema Reference (opens in a new tab)

3. 关系

可以定义两个模型之间的关系,包括一对一、一对多、多对多等。

model User {
  id    Int      @id @default(autoincrement())
  email String   @unique
  name  String?
  // posts Post[] 指向 Post 模型中的 author 字段
  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
}

在这里,User 模型中的 posts 字段表示一对多的关系,Post 模型中的 author 字段表示一对一的关系。

更多的关系可以参考 Prisma Schema Reference (opens in a new tab)

prisma.client

用于操作数据库

1. 连接数据库

import { PrismaClient } from '@prisma/client'
 
const prisma = new PrismaClient()

2. 创建数据

const user = await prisma.user.create({
  data: {
    email: '',
    name: '',
  },
})

3. 查询数据

const users = await prisma.user.findMany()

4. 更新数据

const user = await prisma.user.update({
  where: {
    id: 1,
  },
  data: {
    name: 'new name',
  },
})

5. 删除数据

const user = await prisma.user.delete({
  where: {
    id: 1,
  },
})

6. 关联查询

const user = await prisma.user.findUnique({
  where: {
    id: 1,
  },
  include: {
    posts: true,
  },
})

这将返回一个 User 对象,其中包含 posts 字段,该字段是一个 Post 对象的数组。如:

{
  "id": 1,
  "email": "",
  "name": "new name",
  "posts": [
    {
      "id": 1,
      "title": "title",
      "content": "content",
      "published": false,
      "authorId": 1
    }
  ]
}

7. 事务

const result = await prisma.$transaction([
  prisma.user.create({
    data: {
      email: '',
      name: '',
    },
  }),
  prisma.post.create({
    data: {
      title: '',
      content: '',
      published: false,
      authorId: 1,
    },
  }),
])

表示同时创建 UserPost 两个模型的数据。

seed.ts

用于初始化数据库

import { PrismaClient } from '@prisma/client'
 
const prisma = new PrismaClient()
 
async function main() {
  await prisma.user.create({
    data: {
      email: 'example@w.com',
      name: 'example',
    },
  })
}
 
main()
  .catch((e) => {
    throw e
  })
  .finally(async () => {
    await prisma.$disconnect()
  })