aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--create_metricity_db.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/create_metricity_db.py b/create_metricity_db.py
new file mode 100644
index 0000000..edec2db
--- /dev/null
+++ b/create_metricity_db.py
@@ -0,0 +1,46 @@
+"""Ensures the metricity db exists before running migrations."""
+import os
+from urllib.parse import SplitResult, urlsplit
+
+import psycopg2
+from psycopg2 import sql
+from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
+
+
+def parse_db_url(db_url: str) -> SplitResult:
+ """Validate and split the given databse url."""
+ db_url_parts = urlsplit(db_url)
+ if not all((
+ db_url_parts.hostname,
+ db_url_parts.username,
+ db_url_parts.password
+ )):
+ raise ValueError(
+ "The given db_url is not a valid PostgreSQL database URL."
+ )
+ return db_url_parts
+
+
+if __name__ == "__main__":
+ database_parts = parse_db_url(os.environ["DATABASE_URI"])
+
+ conn = psycopg2.connect(
+ host=database_parts.hostname,
+ port=database_parts.port,
+ user=database_parts.username,
+ password=database_parts.password
+ )
+
+ db_name = database_parts.path[1:] or "metricity"
+
+ # Required to create a database in a .execute() call
+ conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
+ with conn.cursor() as cursor:
+ cursor.execute("SELECT 1 FROM pg_catalog.pg_database WHERE datname = %s", (db_name,))
+ exists = cursor.fetchone()
+ if not exists:
+ print("Creating metricity database.")
+ cursor.execute(
+ sql.SQL("CREATE DATABASE {dbname}").format(dbname=sql.Identifier(db_name))
+ )
+ conn.close()