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 },
});