Prisma 避坑指南!
- 环境变量问题
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
-
npx prisma db push
默认取 .env 配置文件,那多环境怎么处理? -
增加
.env.test
.env.prod
等文件, 安装dotenv-cli
,执行dotenv -e .env.test -- npx prisma db push
来指定 prisma 的运行环境 -
实际项目中与 nodejs (koa、egg、midway、nest)等框架结合使用时,如 midway.js ,包含内置配置文件为 config.test.ts 启动使用
NODE_ENV
来指定环境变量 ,启动命令如下cross-env NODE_ENV=test pm2 start ./bootstrap.js --name=midway-app -i 2
。那么怎么让 prisma 知道是 test 环境呢? -
执行命令
dotenv -e .env.test -- cross-env NODE_ENV=test pm2 start ./bootstarp.js --name=midway-app -i 2
-
Prisma ORM 创建关系型数据库时,如何不创建外键,依然能够关联查询?
- 很简单,增加
relationMode = "prisma"
,选择prisma模式。 注意索引@@index()
datasource db { provider = "mysql" url = env("DATABASE_URL") relationMode = "prisma" }
model User { id String @id @default(uuid()) roleId String? role UserRole? @relation(fields: [roleId], references: [id]) @@index([roleId]) @@map("user_admin") } model UserRole { id String @id @default(uuid()) code String @db.VarChar(32) name String @db.VarChar(32) User User[] @@map("user_role") }
- 很简单,增加
-
Prisma 使用
@createAt
与@updateAt
时差问题怎么解决?(这里是mysql,其它应该同理)-
prisma 使用了
@createAt
与@updateAt
在其引擎内部处理时,同一处理成了UTC
时间格式,也就是比北京时间慢8
个小时。(mysql 、linux 时间均正常的情况下)-
可能引擎是国外开发的吧,想自动创建时间,以及修改自动更新时间的话,上面两种不能采取。使用如下方式取代:
model Dept { id Int @id @default(autoincrement()) name String @db.VarChar(255) desc String @db.VarChar(255) createAt DateTime @default(dbgenerated("NOW()")) @db.DateTime updateAt DateTime @default(dbgenerated("NOW() ON UPDATE NOW()")) @db.Timestamp(0) @@map("user_dept") }
- 使用
NOW()
,其实也就是select now()
的时间, updateAt
在mysql
里面想自动更新的话,需要设置字段类型timestamp
,字段值:CURRENT_TIMESTAMP
,以及根据时间戳更新。这里转化成prisma 语法如上
@default(dbgenerated("NOW() ON UPDATE NOW()")) @db.Timestamp(0)
- 使用
-
-
如果有其它关于 prisma 的问题,欢迎一起探讨!