Clojure:如何在生产环境中运行复杂的数据库迁移?



想象一下,你有一个任务来执行复杂的数据库迁移,作为新版本发布到生产环境的一部分,你通常会如何在Clojure项目中做到这一点?

新的"大"版本迁移的示例:

  • V1__create_new_tables(很简单,只需将原版SQL与CREATE TABLE一起使用(
  • V2__perform_complex_migration(创建表foo,遍历另一个表,并使用自定义Clojure代码用一些数据填充新的foo表(
  • V3__do_something_else(简单,可能是另一个简单的SQL查询

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

看起来Flyway DB具有Java迁移,这看起来正是需要的,但是有没有办法从Clojure使用它?

也许可以添加另一个.clj文件以及其他.sql迁移,Flyway 会选择它?

我有点惊讶我无法为Clojure中似乎非常常见的任务提供任何示例,只有简单的SQL查询。

引用 Migratus README:

定义基于代码的迁移

通过向迁移添加 .edn 文件来创建基于代码的迁移 包含要运行的命名空间和向上/向下函数的目录, 例如 resources/migrations/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 向下 fn 更改为 nil。

最新更新