想象一下,你有一个任务来执行复杂的数据库迁移,作为新版本发布到生产环境的一部分,你通常会如何在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。