Effacer toute contrainte de clé étrangère vers une vue de datamaster au syncdb
[auf_django_references.git] / auf / django / references / management / __init__.py
index bb99869..96bb4eb 100644 (file)
@@ -1,18 +1,19 @@
 # encoding: utf-8
 
 from django import db
-from django.db.models import get_models, signals
-from django.conf import settings
+from django.db.models import signals
 
 import auf.django.references.models
 
+
 def post_syncdb(sender, **kwargs):
     """Création des vues vers datamaster."""
 
     # On ne crée des vues que si on est sur une BD MySQL.
     # L'attribut db.connection.vendor n'est présent qu'à partir de Django
     # 1.3
-    if (hasattr(db.connection, 'vendor') and db.connection.vendor != 'mysql') or \
+    if (hasattr(db.connection, 'vendor')
+        and db.connection.vendor != 'mysql') or \
        'mysql' not in db.backend.__name__:
         return
 
@@ -34,10 +35,27 @@ def post_syncdb(sender, **kwargs):
 
     # On peut maintenant créer les vues
     cursor = db.connection.cursor()
+    schema = db.connection.settings_dict['NAME']
     for table in datamaster_tables:
         print u"Création d'une vue vers datamaster.%s" % table
         cursor.execute(
-            'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM datamaster.`%s`' % (table, table)
+            'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM datamaster.`%s`' %
+            (table, table)
         )
 
+        # Vérifions s'il y a des foreign keys vers cette vue.
+        cursor.execute(
+            '''
+            SELECT TABLE_NAME, CONSTRAINT_NAME
+            FROM information_schema.REFERENTIAL_CONSTRAINTS
+            WHERE CONSTRAINT_SCHEMA = %s AND REFERENCED_TABLE_NAME = %s
+            ''',
+            (schema, table)
+        )
+        for row in cursor:
+            db.connection.cursor().execute(
+                'ALTER TABLE %s DROP FOREIGN KEY %s' % row
+            )
+
+
 signals.post_syncdb.connect(post_syncdb, sender=auf.django.references.models)