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 e607fbe..96bb4eb 100644 (file)
@@ -1,20 +1,61 @@
 # encoding: utf-8
 
-from django.db import connection
-from django.db.models import get_models, signals
+from django import db
+from django.db.models import signals
 
 import auf.django.references.models
 
+
 def post_syncdb(sender, **kwargs):
-    if connection.vendor == 'mysql':
-        print u'Création des vues pour les données de référence...'
-        cursor = connection.cursor()
-        for model in get_models():
-            if model.__module__ == 'auf.django.references.models':
-                table_name = model._meta.db_table
-                cursor.execute(
-                    'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM datamaster.`%s`' %
-                    (table_name, table_name)
-                )
+    """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 \
+       'mysql' not in db.backend.__name__:
+        return
+
+    cursor = db.connection.cursor()
+
+    # Vérifions qu'on a une BD qui s'appelle 'datamaster'
+    if not cursor.execute("SHOW DATABASES LIKE 'datamaster'"):
+        return
+
+    # Déterminons la liste de tables de référence dans datamaster
+    cursor.execute("SHOW TABLES IN datamaster LIKE 'ref\\_%%'")
+    datamaster_tables = set(row[0] for row in cursor)
+
+    # Déterminons la liste de tables que nous avons déjà et
+    # enlevons-les des tables de datamaster
+    cursor.execute("SHOW FULL TABLES WHERE Table_type != 'VIEW'")
+    my_tables = set(row[0] for row in cursor)
+    datamaster_tables.difference_update(my_tables)
+
+    # 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)
+        )
+
+        # 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)