prisma

97 阅读2分钟

prisma

网上说:
多数据源太难用
连不了中文名数据库

安装配置

npm install prisma @prisma/client
npx prisma init  # 初始化 Prisma 配置

生成 prisma/schema.prisma 和 .env 文件
.env文件配置数据库连接字符串
DATABASE_URL="postgresql://user:pass@localhost:5432/db"DATABASE_URL="mysql://root:密码@localhost:3306/数据库名?timezone=UTC"
vscode安装插件,prisma.schema就可以高亮和格式化

区分环境

不能利用cross-env?
npm install -g dotenv-cli
开发环境下
"prisma:migdev": "dotenv -e .env.development -- npx prisma migrate dev"
命令:npm run prisma:migdev
执行数据库迁移

添加模型

schema.prisma

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

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

// 用户
model User {
    id             Int              @id @default(autoincrement())
    username       String           @unique
    password       String
    avatar         String?
    telephone      String?
    email          String?          @unique
    isFrozen       Boolean          @default(false)
    isCancel       Boolean          @default(false)
    createAt       DateTime         @default(now())
    updateAt       DateTime         @updatedAt

    @@map("user") // 表名首字母小写
}
npm run prisma:migdev
数据库中生成user表

常用注解

@id:定义主键
@unique: 添加唯一约束
@relation: 通常用于多对一或一对多的关系
@default(): 设置默认字段

@default(uuid()): 默认值为随机生成的uuid
@default(now()): 默认值为当前时间戳
@default(autoincrement()): 默认值为自增的数字

relation

name 标记名称
fields 当前模型的字段列表(一般使用 id)
references 关联模型的字段列表
map 自定义名字
onUpdate 定义更新关联 action
onDelete 定义删除 action

map

生成的数据库表名
lunix系统区分大小写
prisma下表名首字母大写
@@map("user")映射后统一小写

prisma模块

import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';

@Global()
@Module({
    providers:[PrismaService],
    exports:[PrismaService]
})
export class PrismaModule {}
import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
  constructor() {
    super({
      log: ['query', 'info', 'warn', 'error'],
    });
  }

  async onModuleInit() {
    await this.$connect();
  }

  async onModuleDestroy() {
    await this.$disconnect();
  }
}

使用

  constructor(
    private readonly prismaService: PrismaService,
  ) { }
// 用户名是否存在
const findUser = await this.prismaService.user.findUnique({
  where: { username: cud.username }
})

常用操作

create
update
findUnique
findMany
findFirst
delete

upsert

update + insert,即根据唯一键(主键或唯一索引)判断数据是否存在
•存在则更新字段;
•不存在则插入新记录
await prisma.user.upsert({
  where: { email: "alice@example.com" },
  update: { name: "Alice Updated" },
  create: { name: "Alice", email: "alice@example.com", age: 25 },
});