diff options
author | 2021-09-10 20:51:10 +0100 | |
---|---|---|
committer | 2021-09-10 20:51:10 +0100 | |
commit | f1219bc472bfa497057a1535b6d37752002e8492 (patch) | |
tree | af0717e76f4b0b8f4bb440f8ceee1563e6d480b9 /create_metricity_db.py | |
parent | Merge pull request #6 from python-discord/sync-channels-guard-no-category (diff) | |
parent | Capitalise SKIP_METRICITY env var name (diff) |
Merge pull request #7 from python-discord/metricity-creates-own-database
Diffstat (limited to 'create_metricity_db.py')
-rw-r--r-- | create_metricity_db.py | 46 |
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() |