1
0

migrate_to_mariadb.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/env python3
  2. """
  3. Script de migration de SQLite vers MariaDB
  4. Usage: python scripts/migrate_to_mariadb.py
  5. """
  6. import os
  7. import sys
  8. import django
  9. from pathlib import Path
  10. # Ajouter le répertoire parent au path
  11. BASE_DIR = Path(__file__).resolve().parent.parent
  12. sys.path.insert(0, str(BASE_DIR))
  13. # Setup Django
  14. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'duhaz_blog.settings')
  15. django.setup()
  16. from django.core.management import call_command
  17. from django.conf import settings
  18. import subprocess
  19. def export_sqlite_data():
  20. """Exporter les données de SQLite"""
  21. print("📤 Export des données depuis SQLite...")
  22. # Créer un dossier pour les dumps
  23. dump_dir = BASE_DIR / 'backup'
  24. dump_dir.mkdir(exist_ok=True)
  25. dump_file = dump_dir / 'sqlite_data.json'
  26. # Exporter toutes les données
  27. call_command('dumpdata',
  28. '--natural-foreign',
  29. '--natural-primary',
  30. '--exclude=contenttypes',
  31. '--exclude=auth.permission',
  32. '--indent=2',
  33. '--output', str(dump_file))
  34. print(f"✅ Données exportées vers {dump_file}")
  35. return dump_file
  36. def import_to_mariadb(dump_file):
  37. """Importer les données dans MariaDB"""
  38. print("\n📥 Import des données dans MariaDB...")
  39. # S'assurer que nous utilisons bien MariaDB
  40. if settings.DATABASES['default']['ENGINE'] != 'django.db.backends.mysql':
  41. print("❌ Erreur: La configuration n'utilise pas MariaDB!")
  42. print(f" Moteur actuel: {settings.DATABASES['default']['ENGINE']}")
  43. print(" Vérifiez votre fichier .env (DB_ENGINE=mysql)")
  44. return False
  45. # Créer les tables
  46. print("🔧 Création des tables...")
  47. call_command('migrate', '--run-syncdb')
  48. # Importer les données
  49. print("📊 Import des données...")
  50. call_command('loaddata', str(dump_file))
  51. print("✅ Données importées avec succès!")
  52. return True
  53. def verify_migration():
  54. """Vérifier la migration"""
  55. print("\n🔍 Vérification de la migration...")
  56. from django.contrib.auth.models import User
  57. from blog.models import Article
  58. user_count = User.objects.count()
  59. article_count = Article.objects.count()
  60. print(f" 👥 Utilisateurs: {user_count}")
  61. print(f" 📝 Articles: {article_count}")
  62. return True
  63. def main():
  64. print("=" * 60)
  65. print("🚀 Migration SQLite → MariaDB")
  66. print("=" * 60)
  67. # Vérifier que nous sommes bien en SQLite avant l'export
  68. if settings.DATABASES['default']['ENGINE'] != 'django.db.backends.sqlite3':
  69. print("⚠️ Attention: Vous n'êtes pas en mode SQLite!")
  70. print(f" Moteur actuel: {settings.DATABASES['default']['ENGINE']}")
  71. response = input(" Voulez-vous continuer quand même? (o/N): ")
  72. if response.lower() != 'o':
  73. print("❌ Migration annulée")
  74. return
  75. try:
  76. # Étape 1: Export SQLite
  77. dump_file = export_sqlite_data()
  78. print("\n" + "=" * 60)
  79. print("⚠️ IMPORTANT: Maintenant, modifiez votre fichier .env")
  80. print("=" * 60)
  81. print("Changez DB_ENGINE de 'sqlite3' à 'mysql'")
  82. print("Vérifiez que les paramètres DB_NAME, DB_USER, etc. sont corrects")
  83. print()
  84. input("Appuyez sur Entrée quand c'est fait...")
  85. # Recharger Django avec la nouvelle config
  86. from importlib import reload
  87. import duhaz_blog.settings
  88. reload(duhaz_blog.settings)
  89. # Étape 2: Import MariaDB
  90. if import_to_mariadb(dump_file):
  91. # Étape 3: Vérification
  92. verify_migration()
  93. print("\n" + "=" * 60)
  94. print("✅ Migration terminée avec succès!")
  95. print("=" * 60)
  96. print("\n📋 Prochaines étapes:")
  97. print(" 1. Testez votre application")
  98. print(" 2. Vérifiez que toutes les données sont présentes")
  99. print(" 3. Une fois confirmé, vous pouvez supprimer db.sqlite3")
  100. print(f" 4. Gardez le backup: {dump_file}")
  101. else:
  102. print("\n❌ La migration a échoué")
  103. except Exception as e:
  104. print(f"\n❌ Erreur lors de la migration: {e}")
  105. import traceback
  106. traceback.print_exc()
  107. return 1
  108. return 0
  109. if __name__ == '__main__':
  110. sys.exit(main())