import os import subprocess import time from urllib.parse import urlparse import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT from dotenv import load_dotenv, set_key def main(): print("Initialisation du systeme de migrations Alembic...") # 1. Charger l'environnement env_path = ".env" load_dotenv(env_path) # 2. Vérifier et ajouter POSTGRES_PASSWORD si manquant (pour aligner avec docker-compose) if not os.getenv("POSTGRES_PASSWORD"): print("Ajout de POSTGRES_PASSWORD=onion123 dans .env pour Docker...") set_key(env_path, "POSTGRES_PASSWORD", "onion123") db_url = os.getenv("DATABASE_URL") if not db_url: print("Erreur: DATABASE_URL non trouvee dans .env") return parsed_url = urlparse(db_url) db_name = parsed_url.path.lstrip('/') test_db_name = f"{db_name}_alembic_temp" # URL de connexion à la base par défaut (postgres) pour créer la base temporaire default_db_url = db_url.replace(f"/{db_name}", "/postgres") print(f"Creation d'une base de donnees temporaire '{test_db_name}' pour generer la migration propre...") try: conn = psycopg2.connect(default_db_url) conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cur = conn.cursor() cur.execute(f"DROP DATABASE IF EXISTS {test_db_name};") cur.execute(f"CREATE DATABASE {test_db_name};") cur.close() conn.close() except Exception as e: import traceback print(f"Erreur lors de la connexion a PostgreSQL local: {traceback.format_exc()}") print("Assurez-vous que votre conteneur Docker PostgreSQL est bien lance avec: docker-compose up -d postgres") return # 3. Générer la migration en pointant vers la base temporaire print("Generation du fichier de migration initial...") test_db_url = db_url.replace(f"/{db_name}", f"/{test_db_name}") # Temporarily set the env var for the subprocess env = os.environ.copy() env["DATABASE_URL"] = test_db_url print("Generation de la nouvelle migration avec les differences...") result = subprocess.run( ["alembic", "revision", "--autogenerate", "-m", "Sync recent architecture changes"], env=env, capture_output=True, text=True ) if result.returncode != 0: print("Erreur lors de la generation de la migration:") print(result.stderr) return print("Migration generee avec succes (alembic/versions/).") # 4. Nettoyer la base temporaire print("Suppression de la base temporaire...") try: conn = psycopg2.connect(default_db_url) conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cur = conn.cursor() cur.execute(f"DROP DATABASE {test_db_name};") cur.close() conn.close() except Exception as e: print(f"Impossible de supprimer la base temporaire: {e}") # 5. Marquer la base de données actuelle (qui contient déjà des tables via main.py) comme étant à jour print("Marquage de la base de donnees locale actuelle comme etant a jour ('stamp head')...") stamp_result = subprocess.run( ["alembic", "stamp", "head"], capture_output=True, text=True ) if stamp_result.returncode != 0: print("Erreur lors du marquage (stamp):") print(stamp_result.stderr) return print("Termine ! Votre systeme de migration est pret.") print("En production (ex: Supabase), executez simplement: alembic upgrade head") if __name__ == "__main__": main()