【问题标题】:Yesod app on keter with read-only access to DBketer 上的 Yesod 应用程序具有对 DB 的只读访问权限
【发布时间】:2025-12-07 02:30:01
【问题描述】:

我有几个使用 keter 和 PostgreSQL 部署的 yesod 应用程序。我真正喜欢它们的是部署时发生的自动数据库迁移。

但是,现在我遇到了一个小问题:我在另一个虚拟机上设置了数据库副本;第二个 DB 是从站,因此是只读的。当我在部署应用程序的情况下启动 keter 时,应用程序无法启动,因为它们无法成功执行迁移脚本。只有虚拟更改,没有真正的表更改,但应用程序无法启动 "cannot execute ALTER TABLE in a read-only transaction".

是否可以在启动时通过 keter 或应用配置或 ENV 变量临时禁用迁移脚本?

【问题讨论】:

    标签: haskell yesod keter


    【解决方案1】:

    是否可以在启动时通过 keter 或应用配置或 ENV 变量临时禁用迁移脚本?

    是的,这是可能的。在我看来,最简单的方法是使用环境变量。 如果您使用的是 yesod 的脚手架站点,那么您必须在运行迁移的 makeFoundation 函数中进行更改。请注意名为runMigration 的函数用于执行它。您需要添加适当的条件才能使其工作。

    【讨论】:

    • 谢谢,但我的意思是在不修改应用程序代码的情况下这样做。
    • @artem 如果不修改代码,我看不到任何方法。我可以想象的一个假设是查看 postgres 是否提供任何查询来检查它是否处于只读模式。然后,您可以在 runMigration 函数中使用该信息来不运行任何迁移。但要使其正常工作,您必须修补 persistent 库并修改一些代码!
    • 是的,所以我认为这是“不可能”的答案