From 072e0b3f4d417ed96fd5334eed63d56dff6b2d53 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell Date: Sat, 13 Mar 2021 12:09:35 +0100 Subject: [PATCH] migrations --- backend/README.md | 12 ++++++- backend/deps.edn | 3 ++ .../001-initial-db.edn} | 31 ++++++++++++------- .../migrations/002-customer-groups.edn | 19 ++++++++++++ backend/src/chicken_master/migrate.clj | 14 +++++++++ 5 files changed, 66 insertions(+), 13 deletions(-) rename backend/resources/{schema.sql => migrations/001-initial-db.edn} (69%) create mode 100644 backend/resources/migrations/002-customer-groups.edn create mode 100644 backend/src/chicken_master/migrate.clj diff --git a/backend/README.md b/backend/README.md index beada27..cd27117 100644 --- a/backend/README.md +++ b/backend/README.md @@ -7,7 +7,7 @@ The API for the chickens service. 1) Setup the development database: docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres - psql 'postgresql://localhost/postgres?user=postgres&password=mysecretpassword' < resources/schema.sql + clojure -A:migrate up 2) Start the server: @@ -21,3 +21,13 @@ The API for the chickens service. clojure -X:depstar uberjar java -Dconfig=config/dev/config.edn -jar chickens.jar + +## Migrations + +To the newest migration + + clojure -A:migrate up + +Down one + + clojure -A:migrate down diff --git a/backend/deps.edn b/backend/deps.edn index d8d7e54..2c64aab 100644 --- a/backend/deps.edn +++ b/backend/deps.edn @@ -13,6 +13,9 @@ {:dev {:jvm-opts ["-Dconfig=config/dev/config.edn"] :main-opts ["-m" "chicken-master.server"]} + :migrate {:extra-deps {ragtime/ragtime {:mvn/version "0.8.1"}} + :main-opts ["-m" "chicken-master.migrate"]} + :test {:extra-paths ["test"] :extra-deps {lambdaisland/kaocha {:mvn/version "1.0.732"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/backend/resources/schema.sql b/backend/resources/migrations/001-initial-db.edn similarity index 69% rename from backend/resources/schema.sql rename to backend/resources/migrations/001-initial-db.edn index 1eeef60..7d9b1cf 100644 --- a/backend/resources/schema.sql +++ b/backend/resources/migrations/001-initial-db.edn @@ -1,13 +1,13 @@ -CREATE EXTENSION pgcrypto; -CREATE TABLE users ( +{:up ["CREATE EXTENSION pgcrypto;" + "CREATE TABLE users ( id SERIAL, name VARCHAR(256) UNIQUE, password VARCHAR(256), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY(id) -); +);" -CREATE TABLE customers ( + "CREATE TABLE customers ( id SERIAL, name VARCHAR(512), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), @@ -16,9 +16,9 @@ CREATE TABLE customers ( PRIMARY KEY(id), UNIQUE(name, user_id), CONSTRAINT fk_users FOREIGN KEY(user_id) REFERENCES users(id) -); +);" -CREATE TABLE products ( + "CREATE TABLE products ( id SERIAL, name VARCHAR(512), amount NUMERIC, @@ -28,10 +28,10 @@ CREATE TABLE products ( PRIMARY KEY(id), UNIQUE(name, user_id), CONSTRAINT fk_users FOREIGN KEY(user_id) REFERENCES users(id) -); +);" -CREATE TYPE order_state AS ENUM('waiting', 'fulfilled', 'canceled'); -CREATE TABLE orders ( + "CREATE TYPE order_state AS ENUM('waiting', 'fulfilled', 'canceled');" + "CREATE TABLE orders ( id SERIAL, customer_id INT, notes TEXT, @@ -42,9 +42,9 @@ CREATE TABLE orders ( PRIMARY KEY(id), CONSTRAINT fk_customer FOREIGN KEY(customer_id) REFERENCES customers(id), CONSTRAINT fk_users FOREIGN KEY(user_id) REFERENCES users(id) -); +);" -CREATE TABLE order_products ( + "CREATE TABLE order_products ( id SERIAL, order_id INT, product_id INT, @@ -52,4 +52,11 @@ CREATE TABLE order_products ( PRIMARY KEY(id), CONSTRAINT fk_order FOREIGN KEY(order_id) REFERENCES orders(id), CONSTRAINT fk_product FOREIGN KEY(product_id) REFERENCES products(id) -); +);"] + :down ["DROP TABLE order_products" + "DROP TABLE products" + "DROP TABLE orders" + "DROP TYPE order_state" + "DROP TABLE customers" + "DROP TABLE users" + "DROP EXTENSION pgcrypto"]} diff --git a/backend/resources/migrations/002-customer-groups.edn b/backend/resources/migrations/002-customer-groups.edn new file mode 100644 index 0000000..7f3d1ee --- /dev/null +++ b/backend/resources/migrations/002-customer-groups.edn @@ -0,0 +1,19 @@ +{:up ["CREATE TABLE customer_groups ( + id SERIAL, + customer_id INT, + name VARCHAR(512), + user_id INT, + PRIMARY KEY(id), + CONSTRAINT fk_customer FOREIGN KEY(customer_id) REFERENCES customers(id) +);" + "CREATE TABLE customer_group_products ( + id SERIAL, + customer_group_id INT, + product_id INT, + amount NUMERIC, + PRIMARY KEY(id), + CONSTRAINT fk_customer_groups FOREIGN KEY(customer_group_id) REFERENCES customer_groups(id), + CONSTRAINT fk_product FOREIGN KEY(product_id) REFERENCES products(id) +);"] + :down ["DROP TABLE customer_group_products;" + "DROP TABLE customer_groups;"]} diff --git a/backend/src/chicken_master/migrate.clj b/backend/src/chicken_master/migrate.clj new file mode 100644 index 0000000..ede3b9e --- /dev/null +++ b/backend/src/chicken_master/migrate.clj @@ -0,0 +1,14 @@ +(ns chicken-master.migrate + (:require [ragtime.jdbc :as jdbc] + [ragtime.repl :as repl] + [config.core :refer [env]])) + +(def config + {:datastore (jdbc/sql-database {:connection-uri (-> env :db-uri :jdbcUrl)}) + :migrations (jdbc/load-resources "migrations")}) + +(defn -main [command] + (condp = command + "up" (repl/migrate config) + "down" (repl/rollback config) + (println "up|migrate")))