85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
import os
|
|
import sys
|
|
import argparse
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
# Hardcoded directories
|
|
MIGRATIONS_DIR = "migrations"
|
|
SEEDS_DIR = "seeds"
|
|
|
|
def main():
|
|
# Connection settings are env-overridable so the script can target either a
|
|
# local Postgres or the shared dcntrlized-db container (PGHOST=dcntrlized-db).
|
|
user = os.environ.get("PGUSER", "postgres")
|
|
password = os.environ.get("PGPASSWORD", "")
|
|
dbname = os.environ.get("PGDATABASE", "postgres")
|
|
host = os.environ.get("PGHOST", "localhost")
|
|
port = os.environ.get("PGPORT", "5432")
|
|
|
|
print("==========================================")
|
|
print("Starting Database Setup & Seeding")
|
|
print(f"Host: {host}:{port} | User: {user} | DB: {dbname}")
|
|
print("==========================================\n")
|
|
|
|
os.environ["PGUSER"] = user
|
|
os.environ["PGPASSWORD"] = password
|
|
os.environ["PGDATABASE"] = dbname
|
|
os.environ["PGHOST"] = host
|
|
os.environ["PGPORT"] = port
|
|
|
|
# 1. Run SQL Migrations
|
|
print("--- Running SQL Migrations ---")
|
|
migrations_path = Path(MIGRATIONS_DIR)
|
|
|
|
if not migrations_path.is_dir():
|
|
print(f"Warning: Migrations directory '{MIGRATIONS_DIR}' not found.")
|
|
else:
|
|
# Grab all .sql files and sort them (e.g., 001_..., 002_...)
|
|
sql_files = sorted(migrations_path.glob("*.sql"))
|
|
if not sql_files:
|
|
print(f"No SQL migration files found in '{MIGRATIONS_DIR}/'.")
|
|
|
|
for sql_file in sql_files:
|
|
print(f"Applying: {sql_file.name}")
|
|
# Run psql with ON_ERROR_STOP=1 to fail fast if SQL throws an error
|
|
result = subprocess.run(
|
|
["psql", "-v", "ON_ERROR_STOP=1", "-f", str(sql_file)],
|
|
check=False
|
|
)
|
|
if result.returncode != 0:
|
|
print(f"\n❌ Migration failed on {sql_file.name}")
|
|
sys.exit(result.returncode)
|
|
|
|
# 2. Run Python Seed Scripts
|
|
print("\n--- Running Python Seed Scripts ---")
|
|
|
|
os.environ["PGDATABASE"] = "dcntrlized"
|
|
|
|
seeds_path = Path(SEEDS_DIR)
|
|
|
|
if not seeds_path.is_dir():
|
|
print(f"Warning: Seeds directory '{SEEDS_DIR}' not found.")
|
|
else:
|
|
# Grab all .py files and sort them
|
|
py_files = sorted(seeds_path.glob("*.py"))
|
|
if not py_files:
|
|
print(f"No Python seed files found in '{SEEDS_DIR}/'.")
|
|
|
|
for py_file in py_files:
|
|
print(f"Executing: {py_file.name}")
|
|
# Run the seed script using the same Python interpreter running this script
|
|
result = subprocess.run(
|
|
[sys.executable, str(py_file)],
|
|
check=False
|
|
)
|
|
if result.returncode != 0:
|
|
print(f"\n❌ Seeding failed on {py_file.name}")
|
|
sys.exit(result.returncode)
|
|
|
|
print("\n==========================================")
|
|
print("✅ All migrations and seeds completed successfully!")
|
|
print("==========================================")
|
|
|
|
if __name__ == "__main__":
|
|
main() |