Spaces:
Runtime error
Runtime error
Claude Opus 5
fix(qualite): ruff devient une vraie barriere, et trouve un schema mort et casse
7435134 Download scripts/reset_database.py from rahim237cm/jurix-api: direct link, hf CLI and curl.
- Browser
- Download file 5.85 kB
-
https://huggingface.co/spaces/rahim237cm/jurix-api/resolve/main/scripts/reset_database.py
- Command line
-
hf download hf://spaces/rahim237cm/jurix-api/scripts/reset_database.py
-
curl -L -o reset_database.py https://huggingface.co/spaces/rahim237cm/jurix-api/resolve/main/scripts/reset_database.py
5.85 kB
| """ | |
| Script SIMPLE et ROBUSTE pour vider la base de données. | |
| Utilise la méthode la plus directe avec gestion d'erreurs complète. | |
| """ | |
| # L'URL vient de Settings, pas d'une constante. | |
| # | |
| # Elle etait ecrite en dur ici, mot de passe compris, et pointait sur un port | |
| # (5432) et une base (`jurix_db`) qui n'existent pas : le script ne pouvait de | |
| # toute facon plus se connecter. Passer par Settings lui rend son utilite ET | |
| # retire le secret du depot. | |
| import sys | |
| from pathlib import Path | |
| import psycopg2 | |
| from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT | |
| sys.path.insert(0, str(Path(__file__).resolve().parents[1])) | |
| from app.core.config import settings | |
| # psycopg2 ne comprend pas le prefixe +asyncpg de SQLAlchemy. | |
| DATABASE_URL = settings.DATABASE_URL.replace("postgresql+asyncpg://", "postgresql://") | |
| def reset_database_fixed(): | |
| """Vide la base de données de manière robuste.""" | |
| print("=" * 70) | |
| print("🚀 RÉINITIALISATION DE LA BASE DE DONNÉES") | |
| print("=" * 70) | |
| print() | |
| try: | |
| # Connexion à PostgreSQL avec autocommit | |
| print("📡 Connexion à PostgreSQL...") | |
| conn = psycopg2.connect(DATABASE_URL) | |
| conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # Chaque commande est immédiate | |
| cursor = conn.cursor() | |
| print(" ✅ Connecté (mode AUTOCOMMIT)") | |
| print() | |
| # 1. Compter avant suppression | |
| cursor.execute("SELECT COUNT(*) FROM laws") | |
| laws_before = cursor.fetchone()[0] | |
| cursor.execute("SELECT COUNT(*) FROM articles") | |
| articles_before = cursor.fetchone()[0] | |
| print("📊 État AVANT:") | |
| print(f" • Documents: {laws_before}") | |
| print(f" • Articles: {articles_before}") | |
| print() | |
| # 2. TRUNCATE avec CASCADE (le plus efficace) | |
| print("🗑️ Suppression avec TRUNCATE CASCADE...") | |
| try: | |
| # Essayer avec toutes les tables d'un coup | |
| cursor.execute(""" | |
| TRUNCATE TABLE | |
| articles, | |
| laws, | |
| chat_messages, | |
| conversations | |
| RESTART IDENTITY CASCADE | |
| """) | |
| print(" ✅ Toutes les tables vidées") | |
| except psycopg2.ProgrammingError: | |
| # Si certaines tables n'existent pas, essayer une par une | |
| print(" ⚠️ Erreur TRUNCATE global, essai individuel...") | |
| tables = ['articles', 'chat_messages', 'conversations', 'laws'] | |
| for table in tables: | |
| try: | |
| cursor.execute(f"TRUNCATE TABLE {table} RESTART IDENTITY CASCADE") | |
| print(f" ✅ Table '{table}' vidée") | |
| except Exception as e: | |
| print(f" ⏭️ Table '{table}' ignorée: {str(e)[:40]}") | |
| print() | |
| # 3. Vérifier suppression | |
| cursor.execute("SELECT COUNT(*) FROM laws") | |
| laws_after = cursor.fetchone()[0] | |
| cursor.execute("SELECT COUNT(*) FROM articles") | |
| articles_after = cursor.fetchone()[0] | |
| print("📊 État APRÈS:") | |
| print(f" • Documents: {laws_after}") | |
| print(f" • Articles: {articles_after}") | |
| print() | |
| # 4. Réinitialiser séquences (si TRUNCATE n'a pas fonctionné) | |
| if laws_after > 0 or articles_after > 0: | |
| print("⚠️ Suppression incomplète, utilisation de DELETE...") | |
| cursor.execute("DELETE FROM articles CASCADE") | |
| cursor.execute("DELETE FROM laws CASCADE") | |
| cursor.execute("SELECT COUNT(*) FROM laws") | |
| laws_final = cursor.fetchone()[0] | |
| cursor.execute("SELECT COUNT(*) FROM articles") | |
| articles_final = cursor.fetchone()[0] | |
| print(f" • Documents restants: {laws_final}") | |
| print(f" • Articles restants: {articles_final}") | |
| print() | |
| # 5. Réinitialiser séquences explicitement | |
| print("🔢 Réinitialisation des séquences...") | |
| sequences = [ | |
| 'laws_id_seq', | |
| 'articles_id_seq', | |
| 'categories_id_seq', | |
| 'conversations_id_seq', | |
| 'chat_messages_id_seq' | |
| ] | |
| for seq in sequences: | |
| try: | |
| cursor.execute(f"ALTER SEQUENCE {seq} RESTART WITH 1") | |
| print(f" ✅ {seq}") | |
| except Exception as e: | |
| print(f" ⏭️ {seq}: {str(e)[:40]}") | |
| print() | |
| print("=" * 70) | |
| print("✅ RÉINITIALISATION TERMINÉE!") | |
| print("=" * 70) | |
| print() | |
| print("📊 Bilan:") | |
| print(f" • Documents supprimés: {laws_before}") | |
| print(f" • Articles supprimés: {articles_before}") | |
| print(f" • Documents restants: {laws_after}") | |
| print(f" • Articles restants: {articles_after}") | |
| print() | |
| print("🚀 Prochains IDs: laws.id=1, articles.id=1") | |
| print("📤 Prêt pour nouveaux uploads!") | |
| print() | |
| cursor.close() | |
| conn.close() | |
| except psycopg2.OperationalError as e: | |
| print() | |
| print(f"❌ Erreur de connexion: {e}") | |
| print() | |
| print("💡 Solutions:") | |
| print(" 1. Vérifier: docker-compose up -d postgres") | |
| print(" 2. Vérifier le port: netstat -an | findstr :5432") | |
| print(" 3. Tester: docker exec -it jurix_postgres psql -U jurix") | |
| print() | |
| except Exception as e: | |
| print() | |
| print(f"❌ Erreur: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| print() | |
| if __name__ == "__main__": | |
| reset_database_fixed() | |