Node.js&GraphQL 第3部分:Prisma配置~
前提 (qianti)
完全为自己记录的笔记。操作系统是Windows10。数据库是PostgreSQL。
尚未与Nodejs连接。
普瑞斯玛
连接服务器和数据库的GraphQL ORM(对象关系映射)。
虽然也有本地驱动程序,但由于功能更强大,所以使用Prisma(例如迁移和验证非常方便)。
它包装数据库并公开为GraphQL API,可以用于任何类型的数据库。
也可以使用其他ORM(如Sequelize或Mongoose),但由于上述原因,Prisma更灵活,所以为什么不用Prisma呢。
通过GraphQL可以统一客户端-服务器和服务器-数据库之间的通信,这样服务器的角色会变得薄弱起来。只需将客户端的GraphQL查询传递给Prisma,然后将返回的数据直接传递给客户端(需要进行身份验证)的感觉。
Prisma 设置完成
Heroku中的PostgreSQL
-
- 登录Heroku后,点击“Create new app”,不进行任何特殊设置来创建应用。
-
- 转到创建的应用页面,切换到“Overview”选项卡。在“Installed add-ons”选项中选择“Configure Add-ons”。
-
- 在“Add-ons”的搜索框中搜索“Heroku PostgreSQL”,然后选择。
- 选择“Hobby Dev – Free”免费计划来创建并配置数据库。
PostgreSQL图形用户界面 (pgAdmin)
-
- 您可以在以下链接中下载最新的pgAdmin(点击下载xxx.exe文件)
-
- 执行exe文件并按默认设置进行安装
-
- 运行pgAdmin后,GUI界面将在浏览器的选项卡中打开
-
- 在GUI界面上选择“添加新服务器”,然后在连接选项卡上输入适当的名称
-
- 从Heroku的数据库页面中选择“数据库凭据”部分,将其中的主机名复制并粘贴到连接选项卡的“主机名/地址”中
-
- 端口与Heroku的默认设置相同,无需更改
-
- 从Heroku的“数据库凭据”中复制数据库、用户和密码,然后分别粘贴到连接选项卡的“维护数据库/用户名/密码”中
-
- 如果方便的话,可以勾选“保存密码”
-
- 输入完成后,点击“保存”⇒将自动开始连接测试
- 成功连接后,依次打开“服务器”⇒“自定义的服务器名称”⇒“数据库”。在我自己的情况下,有大约6000个数据库,所以我使用Ctrl+F在“数据库凭据”中搜索以找到相应的数据库。
Docker: 镜像容器化平台
-
- 请从https://www.docker.com/get-started上下载Docker Toolbox
-
- 执行.exe文件进行安装(全部默认设置)
- 打开Docker QuickStart Terminal并自动开始初始化处理
普利斯玛
-
- 在中国,只需要一个选项来表达以下内容:
-
- 使用npm install -g prisma全局安装Prisma
-
- 通过prisma -v确认安装情况
-
- 在项目文件夹中运行prisma init [项目名]
-
- 对提示进行以下回答:
-
- 使用现有数据库⇒PostgreSQL⇒否(对于数据库中是否包含现有数据的问题)
-
- 设置新的Prisma服务器还是部署到现有服务器?⇒使用现有数据库
-
- 要部署到哪种类型的数据库?⇒PostgreSQL
-
- 你的数据库中是否包含现有数据?⇒否
-
- 输入数据库主机⇒Heroku数据库凭据中的主机
-
- 输入数据库端口⇒5432
-
- 输入数据库用户⇒Heroku数据库凭据中的用户
-
- 输入数据库密码⇒Heroku数据库凭据中的密码
-
- 输入数据库名称(数据库包括架构)⇒Heroku数据库凭据中的数据库
-
- 使用SSL?⇒是
-
- 选择生成的Prisma客户端的编程语言⇒不生成
- 将创建prisma文件夹和3个文件
・datamodel.prisma ⇒ 这是一个用于GraphQL的类型定义文件(类似于schema.graphql)。Prisma使用此文件来确定数据库结构。
・docker-compose.yml ⇒ 这是Docker的配置文件。
・prisma.yml ⇒ 这是用于Prisma的定义文件。
※yml文件 ⇒ 这是一种类似于json文件的键值对文件。常用于配置。
version: '3' # Dockerのバージョン(以下に続くフィールドを決定する)
services: # 使用するサービス(今回はPrismaだけ)
prisma:
image: prismagraphql/prisma:1.29 # 使用する Docker Container
restart: always # restart when deploy new changes
ports: # 使用するポート
- "4466:4466"
environment:
PRISMA_CONFIG: | # Prismaのコンフィグ
port: 4466
# uncomment the next line and provide the env var PRISMA_MANAGEMENT_API_SECRET=my-secret to activate cluster security
# managementApiSecret: my-secret
databases: # 使用するデータベース
default:
connector: postgres
host: xxx
database: xxx
ssl: true # プロンプトで聞かれたのに書かれていなかったので追記しておく
user: xxx
password: xxx
rawAccess: true
port: '5432'
migrations: true
部署 (bù shǔ)
- 在运行`prisma init`命令后,控制台上会显示以下步骤,请按照步骤操作。
Next steps:
1. Open folder: cd prisma
2. Start your Prisma server: docker-compose up -d
3. Deploy your Prisma service: prisma deploy
・docker-compose up -d ⇒ 安装运行Prisma所需的代码 ⇒ 在虚拟机中启动Prisma
・prisma deploy ⇒ 部署最新更改(例如,如果修改了datamodel.prisma,则通过prisma deploy将更改部署到Prisma,并应用于数据库)
・由于命令无法识别,可以以管理员权限运行cmd以解决问题
・在执行prisma deploy之前,请将prisma.yml按以下方式修改
endpoint: http://[Docker QuickStart Terminalで表示されるIPアドレス]:4466
datamodel: datamodel.prisma
- 一旦执行完prisma deploy后,你可以通过访问[Docker QuickStart终端显示的IP地址]:4466来进入GraphQL Playground(目前该Playground连接到了Prisma提供的GraphQL API)。换句话说,你可以在这个Playground中执行Mutation来实际修改PostgreSQL数据库。Prisma会根据datamodel.prisma中定义的Type和字段自动创建Query/Mutation/Subscription,真是太棒了。
type User {
id: ID! @unique // @uniqueは directives といってフィールドに制約をかけられる代物
name: String!
}
在这个Playground上进行了Mutation操作后,Heroku的PostgreSQL数据库将实际发生更改。
数据库结构的更新
更新datamodel.prisma后,执行”prisma deploy”指令,将其应用于数据库和GraphQL API。
使用Node.js进行连接
npm install prisma-binding
npm install -g graphql-cli
・prisma-binding是一个提供给Node.js的库,用于操作Prisma GraphQL API。
https://github.com/prisma/prisma-binding
・graphql-cli ⇒ GraphQL命令行界面(用于获取模式)
https://github.com/graphql-cli/graphql-cli
由于Prisma默认从ProjectRoot/prisma/datamodel.prisma处获取Schema,所以我们需要使用graphql-cli来将fetch源更改为ProjectRoot/src/generated/prisma.graphql。
将.graphqlconfig文件中指定的Schema获取位置和保存Type定义的位置显示出来。
工作流程
1. 更新 ProjectRoot/prisma/datamodel.prisma 文件以更改类型定义。
2. 执行「prisma deploy」以将更改应用到数据库。
3. 使用「npm run get-schema」从 ProjectRoot/src/generated/prisma.graphql 获取最新的 Schema,并自动将包含所需类型的文件生成到 ProjectRoot/generated/prisma.graphql。
※ 如果在执行「prisma deploy」时出现了 internal server error,请检查与数据库的连接。如果无法从 pgAdmin 中确认数据库表格,请关闭一次 pgAdmin。
※ 当 Prisma 版本过于最新时,可能会出现错误,因此我们降低了它的版本。
※ 不知为何 prisma 的指令未能生效(级联关系的CASCADE/设置为NULL未能生效),不过通过以下方式进行了更改并解决了问题:
1. 将 datamodel.prisma 更改为 datamodel.graphql(内容未做改动)。
2. 将 prisma.yml 更改如下:
endpoint: http://[Docker QuickStart Terminalで表示されるIPアドレス]:4466
datamodel: datamodel.graphql