Skip to content
Snippets Groups Projects
Unverified Commit a73a1d38 authored by Ngoc Khuat's avatar Ngoc Khuat Committed by GitHub
Browse files

[dev tool] Generate sql statement for a migration (#44872)

parent 983814ba
No related branches found
No related tags found
No related merge requests found
......@@ -106,7 +106,8 @@
explain-query]
[dev.migrate
migrate!
rollback!]
rollback!
migration-sql-by-id]
[model-tracking
track!
untrack!
......
(ns dev.migrate
(:gen-class)
(:require
[clojure.string :as str]
[metabase.db :as mdb]
[metabase.db.liquibase :as liquibase]
[metabase.util.malli :as mu]
[toucan2.core :as t2])
(:import
(liquibase Liquibase)))
(liquibase Contexts Liquibase RuntimeEnvironment)
(liquibase.changelog ChangeLogIterator)
(liquibase.changelog.filter ChangeSetFilter)
(liquibase.sqlgenerator SqlGeneratorFactory)
(liquibase.changelog.visitor ListVisitor)))
(set! *warn-on-reflection* true)
......@@ -101,3 +106,37 @@
(throw (ex-info "Invalid command" {:command cmd
:args args})))))
(defn- stmts-to-sql
[stmts sql-generator-factory database]
(str/join "\n" (for [stmt stmts
sql (.generateSql ^SqlGeneratorFactory sql-generator-factory stmt database)]
(.toString sql))))
(defn- change->sql
[change sql-generator-factory database]
{:forward (stmts-to-sql (.generateStatements change database) sql-generator-factory database)
:rollback (stmts-to-sql (.generateRollbackStatements change database) sql-generator-factory database)})
(defn migration-sql-by-id
"Get the sql statements for a specific migration ID.
(migration-sql-by-id \"v51.2024-06-12T18:53:02\")
;; =>
{:forward \"DROP INDEX public.idx_user_id_device_id;\",
:rollback \"CREATE INDEX idx_user_id_device_id ON public.login_history(session_id, device_id);\"}"
[id]
(t2/with-connection [conn]
(liquibase/with-liquibase [^Liquibase liquibase conn]
(let [database (.getDatabase liquibase)
change-log-iterator (ChangeLogIterator. (.getDatabaseChangeLog liquibase) (into-array ChangeSetFilter []))
list-visistor (ListVisitor.)
runtime-env (RuntimeEnvironment. database (Contexts.) nil)
_ (.run change-log-iterator list-visistor runtime-env)
change-set (first (filter #(= id (.getId %))(.getSeenChangeSets list-visistor)))
sql-generator-factory (SqlGeneratorFactory/getInstance)]
(reduce (fn [acc data]
;; merge all changes in one change set into one single :forward and :rollback
(merge-with (fn [x y]
(str x "\n" y)) acc data))
{}
(map #(change->sql % sql-generator-factory database) (.getChanges change-set)))))))
(ns dev.migrate-test
(:require
[clojure.test :refer :all]
[metabase.dev.migrate :as dev.migrate]))
(deftest migration-sql-by-id-test
(is (= {:forward
"ALTER TABLE public.query_field RENAME COLUMN direct_reference TO explicit_reference;",
:rollback
"ALTER TABLE public.query_field RENAME COLUMN explicit_reference TO direct_reference;"}
(dev.migrate/migration-sql-by-id "v51.2024-06-07T12:37:36"))))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment