Skip to main content

Prisma

  • 注意
    • 生成的客户端只能服务端执行 #3142
      • 浏览器端只能通过 GraphQL 使用
  • Prisma 介于 ORM 和 CMS 之间 - 定位类似于 RoR 的数据模块
  • 主要特性
    • 支持 GraphQL 接口
    • 支持多数据库 - PostgreSQL MySQL
    • 支持生成客户端 - TS JS GO
      • 支持实时订阅
    • 数据模型通过 DSL 定义 - 支持自动迁移
  • 架构: 应用 -> Prisma Client -> Prisma Server -> Database
  • 现有的一些问题
# 安装命令行工具npm install -g prisma# 引导初始化# 生成 datamodel.prisma docker-compose.yml prisma.ymlprisma init my-web# 启动 prismacd my-web# GQL控制台 http://localhost:4466/# 管理控制台 http://localhost:4466/_admin# 管理接口 http://localhost:4466/management# 会在数据库创建 management 库进行管理docker-compose up# 部署新的模型prisma deploy

命令行#

# 通过数据库生成模型prisma introspect

prisma.yml#

# prisma 的服务端地址 - 格式 https|https://<地址>/<服务>/<环境/stage># 默认服务名字为 default - 等同于路径 http://localhost:4466/default/default# http://localhost:4466/my-service - 服务名字为 my-service# http://localhost:4466/my-service/dev - 环境为 devendpoint: http://localhost:4466# schema 文件# 可以使用数组指定多个datamodel: datamodel.prisma# 密钥# secret: mysecret42# 支持使用环境变量secret: ${env:PRISMA_SECRET}
# 生成配置generate:  # 生成器  # 可选类型 javascript-client typescript-client flow-client go-client graphql-schema  - generator: typescript-client    output: ./generated/prisma-client/
# 事件钩子hooks:  post-deploy:    - prisma generate
# 基础数据seed:  # 执行脚本创建  run: node data/seed.js  # 导入备份数据创建  import: database/backup.zip
# 任意变量定义# 通过 ${self:custom.datamodelPath} 引用custom:  datamodelPath: myDatamodel

导入导出#

  • 导入接口 http://localhost:4466/my-app/dev/import
  • 导出接口 http://localhost:4466/my-app/dev/export
# 导入curl '__SERVICE_ENDPOINT__/import' -H 'Content-Type: application/json' -H 'Authorization: Bearer __JWT_AUTH_TOKEN__' -d '{"valueType":"__NDF_TYPE__","values": __DATA__ }' -sSv
# 导出curl '__SERVICE_ENDPOINT__/export' -H 'Content-Type: application/json' -H 'Authorization: Bearer __JWT_AUTH_TOKEN__' -d '{"fileType":"__NDF_TYPE__","cursor": {"table":__TABLE__,"row":__ROW__,"field":__FIELD__,"array":__ARRAY__}} }' -sSv

DSL#

  • 语法类似于 GraphQL

简单模型#

type User {  id: ID! @id  name: String!  // 唯一约束  email: String! @unique  // 一对多  addresses: [Address!]!  // 默认值  isAdmin: Boolean @default(value: "false")  role: UserRole @default(value: "USER")
  // 会创建一个中间表 _UserLikedPosts{A,B}  likedPost: [Post!]!  @relation(name: "UserLikedPosts")
  // 元数据字段  createdAt: DateTime! @createdAt  updatedAt: DateTime! @updatedAt
  // JSON 字段 - 默认 256K  data: Json}
type Address {  id: ID! @id
  raw: String  city: String  country: String  zip: String  // 反向关联  user: User @relation(link: INLINE)}
// 如果不想使用创建的中间表可以手动指定type UserLikedPosts @relationTable {  user: User!  post: Post!}
// 枚举enum UserRole {  USER  ADMIN  VISITOR}