2010-04-13 3 views
5

Comment faire pour que syncdb exécute des requêtes SQL (pour la création de table) définies par moi, plutôt que de générer des tables automatiquement.Dans Django, comment créer des tables à partir d'un fichier SQL lors de l'exécution de syncdb

Je suis à la recherche de cette solution car certains modèles particuliers de mon application représentent des vues SQL-table pour une table de base de données héritée. Donc, j'ai créé leurs vues SQL dans mon django-DB comme ceci:

CREATE VIEW legacy_series AS SELECT * FROM legacy.series;

J'ai un modèle d'ingénierie inverse qui représente la vue/legacytable ci-dessus. Mais à chaque fois que je lance syncdb, je dois d'abord créer toutes les vues en exécutant des scripts sql, sinon syncdb crée simplement des tables pour elles (si une vue n'est pas trouvée).

Comment faire pour que syncdb exécute le SQL mentionné ci-dessus?

Répondre

5

Il y a 2 approches possibles que je connais pour adapter vos modèles à une table de base de données existante (sans utiliser des vues qui est):

1) Exécuter python manage.py inspectdb dans votre projet. Cela va générer des modèles pour les tables de base de données existantes, vous pouvez ensuite continuer à travailler avec celles-ci.

2) Modifiez vos tables avec certains paramètres spécifiques. Tout d'abord, vous définissez le nom de la table dans votre modèle en définissant l'option db_table dans vos options meta. Ensuite, vous définissez pour chaque champ le nom de la colonne correspondant à votre base de données existante en définissant l'option db_column. Notez qu'il existe d'autres options db_ que vous pourriez éventuellement utiliser pour correspondre à votre base de données existante.

Si vous voulez vraiment l'approche des vues, une solution (laide) est possible, vous pouvez définir custom sql commands par modèle d'application. Ce fichier se trouve dans "application"/sql/"model" .sql. Django appellera ça sql après avoir créé toutes les tables. Vous pouvez essayer de spécifier des instructions DROP pour les tables générées, suivies de votre instruction create view dans ce fichier. Notez que cela sera un peu compliqué pour les tables avec des clés étrangères car django ne garantit aucun ordre d'exécution de ces fichiers (donc, empaqueter toutes les instructions dans un .sql sera le moyen le plus simple, je n'ai jamais essayé).

4

Vous pouvez utiliser unmanaged models pour vos modèles de reverse-engineering et initial SQL scripts pour créer vos vues.

EDIT:

Un peu réponse plus détaillée. Lorsque vous utilisez des modèles non gérés, syncdb ne crée pas vos tables de base de données pour vous, vous devez donc vous en occuper vous-même. Un point important est le nom de la table, et comment django mappe Model classes aux noms de table, je vous suggère de lire the doc on that point.

Fondamentalement, votre modèle Series ressemblera que:

class Series(models.Model): 
    # model fields... 
    ... 

    class Meta: 
     managed = False 
     db_table = "legacy_series" 

Ensuite, vous pouvez mettre vos commandes SQL dans le fichier yourapp/sql/series.sql:

### yourapp/sql/series.sql 
CREATE VIEW legacy_series AS SELECT * FROM legacy.series; 

Vous pouvez ensuite syncdb comme d'habitude, et commencez à utiliser vos modèles hérités.