【问题标题】:Clojure: How to run complex DB migration in production?Clojure:如何在生产中运行复杂的数据库迁移?
【发布时间】:2020-10-16 10:53:18
【问题描述】:

假设您有一项任务要执行复杂的数据库迁移,作为新版本发布到生产环境的一部分,您通常会如何在 Clojure 项目中执行此操作?

一个新的“大”版本迁移示例:

  • V1__create_new_tables(简单,只需使用带有 CREATE TABLE 的 vanilla SQL)
  • V2__perform_complex_migration(创建 TABLE foo,遍历另一个表并使用自定义 Clojure 代码用一些数据填充新的 foo 表)
  • V3__do_something_else(简单,可以是另一个简单的 SQL 查询

您将如何以自动化方式进行第二次迁移?必须执行所有 3 次迁移才能使新版本成功。

看起来像 Flyway DB has Java migrations,看起来正是需要的,但有什么方法可以从 Clojure 中使用它?

也许可以添加另一个.clj 文件along with other .sql migrations 并且Flyway 会接收它?

我有点惊讶,我没有任何关于 Clojure 中看似非常常见的任务的示例,只有简单的 SQL 查询。

【问题讨论】:

  • 结帐 Migratus。它允许您进行基于普通 sql 和 clojure 代码的迁移。 github.com/yogthos/migratus#code-based-migrations 因此,对于您的 V2 迁移,您将使用基于代码的迁移。
  • @blushrt 谢谢!如果您想发表您的评论作为答案,我会接受它

标签: java clojure jvm flyway


【解决方案1】:

引用Migratus README:

定义基于代码的迁移

通过将 .edn 文件添加到您的迁移来创建基于代码的迁移 包含要运行的命名空间和向上/向下函数的目录, 例如资源/迁移/20170331141500-import-users.edn:

{:ns app.migrations.import-users
 :up-fn migrate-up
 :down-fn migrate-down} 

然后,在 src/app/migrations/import_users.clj 中:

(ns app.migrations.import-users)

(defn migrate-up [config]
;; do stuff here
)

(defn migrate-down [config]    
;; maybe undo stuff here
) 

上下迁移函数都应该接受一个参数, 这是传递给 Migratus 的配置映射(因此您的迁移可以是 可配置)。您可以通过设置省略向上或向下迁移:up-fn 或在 EDN 文件中将 fn 降为 nil。

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多