在非交互式环境中更新 Keystone 项目的 Prisma、GraphQL 和数据库架构

art*_*hur 1 keystonejs github-actions

我正在构建一个正在部署 keystone.js 服务器的 github 操作事件

\n

构建运行时,系统会提示用户回答问题

\n
\xe2\x9e\x9c  server git:(test-me) npm run build\n\n> keystone-app@1.0.0 build\n> keystone build\n\nYour Prisma and GraphQL schemas are not up to date\n\xe2\x9c\x94 Would you like to update your Prisma and GraphQL schemas? \xe2\x80\xa6 no\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题是如何配置工作流程,以便在运行时它会回答“是”?

\n

谢谢!

\n

Mol*_*mby 5

一些背景 \xe2\x80\x93\xc2\xa0 这一切都与 Keystone 如何利用Prisma Migrate的底层功能有关, Prisma Migrate负责在 Keystone 项目中生成和应用数据库迁移。这就是为什么系统的这个区域中的许多消息、命令等都引用“Prisma”。此外,如果需要深入研究迁移,在某些时候,Prisma 的文档将变得比 Keystone 的文档更相关(这实际上只是对这些操作的 Prisma CLI 的包装)。

\n

所以,在这种情况下,听起来你错过了标志db.useMigrations。我将在这里逐字引用这些文档,因为他们很好地解释了它:

\n
\n

在开发过程中,Keystone 将根据您的配置方式,通过以下两种方式之一为您迁移数据库结构db.useMigrations

\n
    \n
  • 如果db.useMigrationsfalse(默认),Keystone 将使用 Prisma Migrate 更新您的数据库,使其与您的架构匹配。更新数据库时可能会丢失数据,因此您应该仅在初始开发中使用此模式。
  • \n
  • 如果db.useMigrationstrue,Keystone 将使用 Prisma Migrate 应用任何现有迁移,并在架构发生更改时提示您创建迁移。
  • \n
\n

当您使用迁移时,建议的工作流程是keystone dev为您生成迁移并在开发中自动应用它们。

\n

将迁移文件提交到源代码管理,然后当您在生产中托管应用程序时,keystone prisma migrate deploy在启动 Keystone 之前使用命令 [..] 部署迁移。

\n
\n

这里发生的事情(我认为)是您尚未设置为db.useMigrationstrue因此您的项目只是在发生更改时重置您的数据库。也就是说,每次 Keystone 启动时,它都会将您的列表模式与数据库进行比较,并询问您是否要重置数据库以匹配,包括它在生产中首次启动时。

\n

这一切都在不生成物理迁移文件的情况下发生 -\xc2\xa0 它只是直接对数据库进行更改。这是在项目早期工作的一种超级方便的方式,当您在本地修改 \xe2\x80\x93 时,您可以添加/删除/重命名等。字段和列表,而无需累积一系列逐步执行这些更改的迁移。这个想法是,当您的模式开始稳定下来并且您想要开始部署时,您打开标志db.useMigrations并开始生成迁移(.sql将执行将数据库与列表模式对齐所需的步骤的文件)。这些文件应提交给版本控制(即 git)并与应用程序代码一起部署。

\n

实际上,您的 Keystone 配置可能如下所示:

\n
export default withAuth(\n  config({\n    db: {\n      provider: \'postgresql\',\n      useMigrations: true,  // <-- Here\n      url: DATABASE_URL,\n    },\n    server: { port: PORT },\n    lists,\n    session,\n  })\n);\n
Run Code Online (Sandbox Code Playgroud)\n

一般来说,一旦您的项目处于您要打开的位置db.useMigrations,您所做的更改就会变得更有条理,因此您通常会将其设置为truedb.useMigrations也许,如果您在某个时候进行了重大的数据库大修,您可能会暂时有一个分支,false但是,一旦您再次对列表感到满意,您就会设置db.useMigrationstrue,用于keystone dev生成迁移,然后合并分支回到main(或者master或者你的主分支的名称)。

\n

另外,请记住,自动迁移实际上只是建议。它们是纯 SQL,因此如果您需要其他步骤(例如,确保重命名字段或列表时不会丢失数据),请随意编辑它们。

\n

您可能还想查看此相关答案,其中我讨论了在部署到 Heroku 的上下文中 Keystone 部署迁移。

\n