diff options
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() | 
