4 from django
.db
.models
import signals
6 import auf
.django
.references
.models
9 def post_syncdb(sender
, **kwargs
):
10 """Création des vues vers datamaster."""
12 verbosity
= kwargs
.get('verbosity', 1)
14 # On ne crée des vues que si on est sur une BD MySQL.
15 # L'attribut db.connection.vendor n'est présent qu'à partir de Django
17 if (hasattr(db
.connection
, 'vendor')
18 and db
.connection
.vendor
!= 'mysql') or \
19 'mysql' not in db
.backend
.__name__
:
22 cursor
= db
.connection
.cursor()
24 # Vérifions qu'on a une BD qui s'appelle 'datamaster'
25 if not cursor
.execute("SHOW DATABASES LIKE 'datamaster'"):
28 # Déterminons la liste de tables de référence dans datamaster
29 cursor
.execute("SHOW TABLES IN datamaster LIKE 'ref\\_%%'")
30 datamaster_tables
= set(row
[0] for row
in cursor
)
32 # Déterminons la liste de tables que nous avons déjà et
33 # enlevons-les des tables de datamaster
34 cursor
.execute("SHOW FULL TABLES WHERE Table_type != 'VIEW'")
35 my_tables
= set(row
[0] for row
in cursor
)
36 datamaster_tables
.difference_update(my_tables
)
38 # On peut maintenant créer les vues
40 print u
"Création des vues vers datamaster"
41 cursor
= db
.connection
.cursor()
42 schema
= db
.connection
.settings_dict
['NAME']
43 for table
in datamaster_tables
:
45 print u
"Création d'une vue vers datamaster.%s" % table
47 'CREATE OR REPLACE VIEW `%s` AS SELECT * FROM datamaster.`%s`' %
51 # Vérifions s'il y a des foreign keys vers cette vue.
54 SELECT TABLE_NAME, CONSTRAINT_NAME
55 FROM information_schema.REFERENTIAL_CONSTRAINTS
56 WHERE CONSTRAINT_SCHEMA = %s AND REFERENCED_TABLE_NAME = %s
61 db
.connection
.cursor().execute(
62 'ALTER TABLE %s DROP FOREIGN KEY %s' % row
66 signals
.post_syncdb
.connect(post_syncdb
, sender
=auf
.django
.references
.models
)