prisma2.0文档学习/翻译

介绍

学习文档时,就是谷歌翻译,记录下来,以后好看。

什么是prisma 框架

在这里插入图片描述
prisma框架(以前简称是prisma2)是一个数据哭框架,包含以下部分:

  • Photon: 类型简单且自动生成的数据库客户端(代替ORM)
  • Lift: 声明式数据模型和迁移
  • studio: 管理员界面,支持各种数据库工作流程
    尽管每个工具都可以单独使用(在新建项目和棕色项目中),但它们可以通过Prisma模式或Prisma Framework CLI等通用组件很好地集成在一起。

开始

开始使用Photon和/或Lift的最简单方法是通过prisma2 cli 命令:

npx prisma2 init hello-prisma

也可以全局安装,在执行命令

npm install -g prisma2
prisma2 init hello-prisma

安装是会有命令交互式提示,将要求您提供数据库的数据库凭据。如果您还没有数据库,请选择SQLite,然后让CLI为您设置数据库文件。

目录

  • 开始
  • 讲解
  • prisma schema 文件
  • 数据资源
  • 数据模型
  • 关系
  • prisma cli
  • 开发模式
  • 自我检查
  • 限制
  • 核心
  • photon
  • lift
  • 导入和导出数据
  • 支持的数据库
  • 遥测
  • 如何为Prisma框架提供反馈?
  • 发布过程
  • 升级指引
  • FAQ
  • 词汇表

开始

开始使用Photon和/或Lift的最简单方法是通过prisma2 cli 命令:

npm install -g prisma2
prisma2 init hello-prisma

注意: Lift和Photon当前处于预览状态!限制包括缺少功能和有限的性能问题。

prisma2 init 流

在运行prisma2 init时,Prisma Framework CLI将启动一个交互式向导,可帮助您开始使用Photon和/或Lift。
下面讲介绍你在运行命令时可能遇到的情况。

Blank project vs Starter kits

一开始会给您两个选择:

  • 空项目: 要从头开始新项目时,可以使用空白项目。此选项还支持现有数据库
  • 入门套件: 入门套件提供了各种使用案例的可运行示例,它们基于prisam-examples存储库中的示例项目。
    该向导将帮助您将入门工具包连接到您自己的数据库。请注意,入门工具包只能在空目录和空数据库中使用。如果您没有正在运行的数据库,则可以选择SQLite。
数据库选择

稍后,向导会询问您要与Photon / Lift一起使用哪种数据库。当前,支持以下数据库:sqlite mysql pg mongoDB
请注意,MySQL和PostgreSQL选项都要求您运行可以在下一步中连接到的数据库。如果您没有正在运行的数据库,请选择SQLite,然后让向导为您创建一个新的SQLite数据库文件。

选择Prisma工具(Photon/Lift)

如果你选择了现成的数据库,你蒋被要求选择prisma 工具:

  • Use Photon and Lift
  • Use only Photon (for database access (ORM))
  • Use only Lift (for database migrations)
    注意:如果仅选择Photon/Lift,则以后仍然可以将其他工具添加到项目中。
语言选择

如果您是从新数据库开始或正在使用入门工具包,则会提示您输入用于访问数据库的语言。当前,Photon支持以下语言:javascript typescript go

安装prisma cli
npm install -g prisma2
yarn global add prisma2

prisma 教程

在本教程中,您将全面了解Prisma Framework生态系统。这包括使用Lift进行数据库迁移,以及使用Photon.js进行类型安全的数据库访问
本教程将教您如何:
1.使用init命令设置一个新项目
2. 了解Prisma项目设置的基本部分
3. 使用dev命令进行开发
4. 使用lift子命令迁移数据库schema
在本教程中,我们将从头开始,将TypeScript与PostgreSQL数据库一起使用。您可以在本地或使用托管服务提供商例如: Heroku or Digital Ocean。 本教程中使用的PostgreSQL数据库托管在Heroku上。
注意:您在执行prisma init的时候,不想设置PostgreSql数据库,仍然可以选SQLite.Prisma的主要优点之一是,它使您可以交换应用程序连接到的数据源。因此,虽然您可以从SQLite开始,但是以后可以通过调整Prisma schema文件中的几行来将相同的设置映射到PostgreSQL。

1. 新建一个新项目

1.1启动prisma2 init初始化向导

Prisma Framework CLI的init命令可帮助您设置新项目并连接到数据库。使用npx运行它:

npx prisma2 init hello-prisma2

这将启动一个交互式向导,以帮助您进行设置,请按照以下步骤操作。 当向导提示时,选择“空白项目”选项。
在这里插入图片描述

1.2选择数据库类型

接下来,向导会提示您选择一个数据库。选择PostgreSQL(如果没有在任何地方运行的PostgreSQL数据库,请使用SQLite)。
在这里插入图片描述

1.3 提供您的数据库凭证

请注意,如果您之前选择了SQLite,则可以跳过此部分。

  1. 提供您的数据库凭证:
    - host
    - ip
    - User and Password: 用户名和密码
    - Database:数据库名称
    - Schema(可选): 您要使用的PostgreSQL模式名称(如果您提供的模式名称不存在,Prisma将为您创建模式;如果未提供,则可以在下一步中选择现有架构)
    - SSL:如果您的PostgreSQL服务器使用SSL,请选中此框(很可能是您不在本地运行);您可以使用SPACE切换它
  2. 确认
    在这里插入图片描述
    此屏幕快照显示了Heroku上托管的数据库的配置。
    请注意,我们为Schema字段提供了名称hello-prisma2。由于提供的d8q8dvp22kfpo3数据库中尚不存在该架构,因此Prisma Framework CLI将使用该名称创建一个架构。
1.4 选择Photon的编程语言

Photon是类型安全的数据库客户端,当前支持JavaScript和TypeScript(此变体称为Photon.js)。在本教程中,您将使用TypeScript。
因此,在向导提示时选择TypeScript。
在这里插入图片描述

1.5 选择演示脚本

向导提供了以演示脚本开始的选项。选择此选项将使您开始使用示例数据模型定义以及可执行脚本,可用于探索一些Photon.js API调用。
在向导提示时,选择演示脚本。
在这里插入图片描述

1.6 探索下一步

选择演示脚本选项后,向导将终止其工作并准备您的项目:
在这里插入图片描述它还会打印成功消息和您要采取的后续步骤:
在这里插入图片描述
在运行终端中显示的命令之前,请稍等片刻!

2.探索您的项目设置

prisma2 init 创建了以下目录结构:
hello-prisma2
├── node_modules
│ └── @prisma
│ └── photon
├── package.json
├── prisma
│ ├── migrations
│ │ └── dev
│ │ └── watch-20190903103132
│ │ ├── README.md
│ │ ├── schema.prisma
│ │ └── steps.json
│ └── schema.prisma
├── script.ts
└── tsconfig.json
让我们浏览创建的文件。

2.1 了解Prisma模式文件

每个使用Photon和/或Lift的项目的核心是Prisma模式文件(通常称为schema.prisma)。这是您的Prisma模式当前的样子:

generator photon {
  provider = "photonjs"
}

datasource db {
  provider = "postgresql"
  url      = "postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA"
}

model User {
  id    String  @default(cuid()) @id
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        String   @default(cuid()) @id
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  published Boolean
  title     String
  content   String?
  author    User?
}

在datasource 配置中的大写字母是你的数据库凭证的占位符。
对于Heroku上托管的PostgreSQL数据库,连接字符串可能类似于以下内容:

datasource db {
  provider = "postgresql"
  url      = "postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus?schema=hello-prisma2"
}

在本地运行PostgreSQL时,您的用户名和密码以及数据库名称通常对应于您操作系统的当前用户,例如:

datasource db {
  provider = "postgresql"
  url      = "postgresql://johndoe:johndoe@localhost:5432/johndoe?schema=hello-prisma2"
}

请注意,也可以将url作为环境变量进行配置。
根据托管PostgreSQL数据库的位置或使用SQLite,datasource配置在架构文件中看起来会有所不同.
Prisma schema 包含项目的三个重要元素:

  • 数据源(这里就是您的PostgreSQL数据库)
  • 生成器(这里是Photon.js的生成器)
  • 数据模型定义(这里是Post和User模型)
2.2理解数据模型定义

schema文件的数据模型有一些职责:

  • 这是对基础数据库架构的声明式描述
  • 它为生成的Photon API提供了基础
    它的主要构建模块是映射到基础PostgreSQL数据库中的表的模型。模型的字段映射到表的列。
    在schema文件中,user model,如下:
model User {
  id    String  @default(cuid()) @id
  email String  @unique
  name  String?
  posts Post[]
}

这定义了一个具有四个字段的模型用户:

  • id字段的类型为String,并带有两个属性:
    @id:表示此字段用作主键
    @default(cuid()):通过生成cuid设置字段的默认值
  • 电子邮件字段的类型为字符串。它用@unique属性注释,这意味着数据库中永远不会有两个记录具有相同的值。这将由Prisma强制执行。
  • 名称字段的类型为String? (阅读:“可选字符串”)。 ?是类型修饰符,表示此字段是可选的。
  • posts字段的类型为Post [],表示与Post模型的关系。 []表示此字段是一个列表(即用户可以有很多帖子)
    快速浏览Post模型:
model Post {
  id        String   @default(cuid()) @id
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  published Boolean
  title     String
  content   String?
  author    User?
}

大多数和您刚刚从用户模型中学到的知识的一样,但是有一些新的东西:

  • createdAt字段的类型为DateTime。带有@default(now())属性的注解表示该字段将使用表示记录创建时间的当前时间戳进行初始化。
  • 使用@updatedAt属性注释了updatedAt字段。每当更新模型的任何字段时,Prisma都会使用当前时间戳更新该字段。
2.3 了解TypeScript设置

该项目还包含一些典型的Node.js / TypeScript设置所需的其他文件:

  • package.json: 定义项目的Node.js依赖项。
  • tsconfig.json:指定您的TypeScript配置。请注意,Photon.js当前需要将esModuleInterop属性设置为true。
  • node_modules / @ prisma / photon:包含生成的Photon.js代码
  • script.ts:包含实际的“应用程序代码”,在本例中为示例脚本,演示一些Photon.js API调用。
    Photon.js放置在node_modules / @ prisma / photon内,可以将其导入代码中,如下所示:
import { Photon } from '@prisma/photon'

由于Photon.js生成到node_modules中,通常通过调用npm install来填充,因此您应确保在每次调用npm install时也生成Photon.js。这就是为什么在package.json中将prisma2 generate(基于Prisma模式生成Photon.js的命令)作为安装后钩子添加的原因:

{
  "name": "script",
  "license": "MIT",
  "dependencies": {
    "@prisma/photon": "2.0.0-preview-017"
  },
  "devDependencies": {
    "ts-node": "8.3.0",
    "typescript": "3.6.2",
    "prisma2": "2.0.0-preview-017"
  },
  "scripts": {
    "start": "ts-node ./script.ts",
    "postinstall": "prisma2 generate"
  }
}

在使用Photon.js的项目上进行协作时,这种方法允许使用常规的Node.js最佳实践,团队成员可以克隆Git存储库,然后运行npm install来获取其Node依赖版本在其本地node_modules目录中。
请注意,@ prisma / photon和prisma2软件包的版本必须始终同步!

2.5 了解migrations文件夹

为了保留迁移历史记录,Prisma默认使用一个名为migrations的文件夹。有两种方法填充迁移文件夹:

  • 只要数据模型处于开发模式,就会将新的迁移生成到migrations / dev中。
  • 每当要使用Lift保留数据模型更改时,它都会获得自己的目录。
    不用担心,您将在下一节中详细了解这两种方法。请注意,dev文件夹中已经存在一个名为watch-TIMESTAMP(其中TIMESTAMP是占位符,真实名称类似于watch-20190903103132)的第一个迁移。这是因为Prisma已经为您准备了项目以便能够立即运行演示脚本,也就是说,它已迁移数据库以匹配您的数据模型定义(即数据库中已经存在一个Post和一个User表)。您可以通过在数据库GUI(例如Postico或TablePlus)中浏览数据库架构来验证这一点:
    在这里插入图片描述
    请注意,migrations / dev文件夹中的迁移被视为“丢弃”迁移。如果要以一种将迁移持久保存在Lift的迁移历史中的方式来发展数据库架构,则需要使用lift子命令执行迁移:prisma2 lift save和prisma2 lift up。

3.运行演示脚本

现在,让我们最后考虑初始化向导终止后已打印到控制台的“下一步”:在这里插入图片描述
说明要进入项目目录,启动Prisma的开发模式,最后执行演示脚本。现在,您现在将跳过prisma2 dev命令并运行script.ts脚本。在此之前,让我们快速看一下其内容:

import { Photon } from '@prisma/photon'

const photon = new Photon()

// A `main` function so that we can use async/await
async function main() {
  // Seed the database with users and posts
  const user1 = await photon.users.create({
    data: {
      email: 'alice@prisma.io',
      name: 'Alice',
      posts: {
        create: {
          title: 'Watch the talks from Prisma Day 2019',
          content: 'https://www.prisma.io/blog/z11sg6ipb3i1/',
          published: true,
        },
      },
    },
    include: {
      posts: true,
    },
  })
  const user2 = await photon.users.create({
    data: {
      email: 'bob@prisma.io',
      name: 'Bob',
      posts: {
        create: [
          {
            title: 'Subscribe to GraphQL Weekly for community news',
            content: 'https://graphqlweekly.com/',
            published: true,
          },
          {
            title: 'Follow Prisma on Twitter',
            content: 'https://twitter.com/prisma/',
            published: false,
          },
        ],
      },
    },
    include: {
      posts: true,
    },
  })
  console.log(`Created users: ${user1.name} (${user1.posts.length} post) and (${user2.posts.length} posts) `)

  // Retrieve all published posts
  const allPosts = await photon.posts.findMany({
    where: { published: true },
  })
  console.log(`Retrieved all published posts: `, allPosts)

  // Create a new post (written by an already existing user with email alice@prisma.io)
  const newPost = await photon.posts.create({
    data: {
      title: 'Join the Prisma Slack community',
      content: 'http://slack.prisma.io',
      published: false,
      author: {
        connect: {
          email: 'alice@prisma.io',
        },
      },
    },
  })
  console.log(`Created a new post: `, newPost)

  // Publish the new post
  const updatedPost = await photon.posts.update({
    where: {
      id: newPost.id,
    },
    data: {
      published: true,
    },
  })
  console.log(`Published the newly created post: `, updatedPost)

  // Retrieve all posts by user with email alice@prisma.io
  const postsByUser = await photon.users
    .findOne({
      where: {
        email: 'alice@prisma.io',
      },
    })
    .posts()
  console.log(`Retrieved all posts from a specific user: `, postsByUser)
}

main()
  .catch(e => console.error(e))
  .finally(async () => {
    await photon.disconnect()
  })

这是代码中发生的事情的简要概述:

  • 使用photon.users.create(…)创建两个名为Alice和Bob的用户
  • 爱丽丝发表了一篇名为《观看Prisma Day 2019的演讲》的文章
  • 鲍勃(Bob)有两篇名为《订阅GraphQL每周刊》的社区新闻和在Twitter上关注Prisma
  • 使用photon.posts.findMany(…)检索所有已发布的帖子
  • 创建一个新帖子,标题为加入Prisma Slack社区,该社区通过用户的电子邮件地址与用户Alice连接
  • 使用photon.posts.update(…)blish Alice的新创建帖子
  • 使用photon.users.findOne(…)。posts()检索Alice的所有帖子
    请注意,使用console.log将每个操作的结果打印到控制台。
    继续并运行代码:
cd hello-prisma2
npm run dev

这将导致以下终端输出,确认所有操作都成功运行:
在这里插入图片描述
如果您使用的是数据库GUI,则还可以验证是否已在此处创建所有记录。

4.以Prisma的开发模式发展您的应用程序

Prisma Framework具有开发模式,可在开发过程中加快迭代速度。可以使用prisma2 dev命令调用它。在开发模式下运行时,Prisma Framework CLI会监视您的schema 文件。然后,无论何时将更改保存到schema文件中,Prisma CLI都会注意到:

  • 重新/生成 Photon
  • 更新数据库schema
  • 为您创建一个Prisma Studio端点
    本质上,运行prisma2 dev是一种快捷方式,可以立即将更改应用到您的项目,否则您必须通过以下命令执行这些更改:
  • prisma2 generate 生成 Photon
  • prisma2 lift save prisma2 lift up 应用一个迁移
    对为开发特定功能而对数据模型所做的更改感到满意后,就可以退出开发模式,并实际上使用Lift进行迁移。在这里了解更多
    现在继续并使用以下命令启动开发模式:
npx prisma2 dev

注意:您可以通过按两次CTRL + C来停止开发模式。
这是终端屏幕现在的样子:
在这里插入图片描述

4.1在Prisma Studio中浏览数据

您可以使用Prisma Studio浏览数据库的当前内容。打开终端中显示的终结点(大多数情况下为http:// localhost:5555 /):
在这里插入图片描述
注意:请在工作室资料库中分享您对Prisma Studio的任何反馈。

4.2添加其它模型

现在让我们在开发模式下运行时演化应用程序。您将在schema中添加一个名为Category的新模型。类别将通过多对多关系连接到Post。如下调整Prisma schema的数据模型:

model User {
  id    String  @default(cuid()) @id
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id         String     @default(cuid()) @id
  createdAt  DateTime   @default(now())
  updatedAt  DateTime   @updatedAt
  published  Boolean
  title      String
  content    String?
  author     User?
 +  categories Category[]
}

 + model Category {
 +   id    String @id @default(cuid())
 +   name  String
 +   posts Post[]
 + }

确保保存文件。保存时,您可以观察终端窗口以查看Prisma的活动:

  • 向数据库架构添加了一个类别表。它还向数据库架构添加了一个名为_CategoryToPost的关系表,以表示多对多关系。请注意,关系表的形状将来将是可配置的,有关详细信息,请参见规范
  • 它重新生成了Photon API,以为新的Category模型添加CRUD操作。
    由于Photon API已更新,因此您现在可以更新script.ts中的代码以创建新类别并将其连接到现有(或新)post。例如,此代码段将创建一个名为“ prisma”的新类别,并将其连接到两个现有post:
const category = await photon.categories.create({
  data: { 
    name: "prisma",
    posts: {
      connect: [{
        id: "__POST_ID_1__"
      }, {
        id: "__POST_ID_2__"
      }]
    }
  },
})
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值