2010-04-13 9 views
5

Come faccio a fare in modo che syncdb esegua query SQL (per la creazione di tabelle) definite da me, invece di generare automaticamente le tabelle.In Django, come creare tabelle da un file SQL quando viene eseguito syncdb

Sto cercando questa soluzione in quanto alcuni modelli particolari nella mia app rappresentano le viste della tabella SQL per una tabella del database legacy. Quindi, ho creato le loro viste SQL nel mio django-DB come questo:

CREATE VIEW legacy_series AS SELECT * FROM legacy.series;

Ho un modello con reverse engineering che rappresenta la vista precedente/legacytable. Ma ogni volta che eseguo syncdb, devo prima creare tutte le viste eseguendo script sql, altrimenti syncdb semplicemente crea tabelle per loro (se non viene trovata una vista).

Come faccio a fare syncdb eseguire il suddetto SQL?

risposta

5

Ci sono 2 possibili approcci che conosco per adattare i modelli a una tabella di database legacy (senza l'utilizzo di punti di vista che è):

1) Mantenere aperta pitone manage.py inspectdb all'interno del progetto. Ciò genererà modelli per le tabelle di database esistenti, è quindi possibile continuare a lavorare con quelli.

2) Modificare le tabelle con alcune impostazioni specifiche. Prima di tutto devi definire il nome della tabella nel tuo modello impostando l'opzione db_table nelle tue meta opzioni. In secondo luogo, per ciascun campo si definisce il nome della colonna in modo che corrisponda al database legacy impostando l'opzione db_column. Nota ci sono altre opzioni db_ che potresti usare per abbinare il tuo database legacy.

Se si desidera realmente che le viste si avvicinino a una soluzione (brutta) è possibile, è possibile definire custom sql commands per modello di applicazione. Questo file si trova in "application"/sql/"model" .sql. Django chiamerà questo sql dopo aver creato tutti i tavoli. Puoi provare a specificare le istruzioni DROP per le tabelle generate seguite dall'istruzione create in questo file. Nota che questo sarà un po 'complicato per le tabelle con chiavi esterne dato che django non garantisce l'ordine di esecuzione di questi file (quindi riempire tutte le istruzioni in un file .sql sarà il modo più semplice di pensare, non l'ho mai provato prima).

4

È possibile utilizzare unmanaged models per i modelli con retroingegneria e initial SQL scripts per creare le viste.

EDIT:

risposta

Un po 'più dettagliata. Quando si utilizzano i modelli non gestiti, syncdb non creerà le tabelle del database per conto proprio, quindi è necessario prendersene cura personalmente. Un punto importante è il nome della tabella e il modo in cui django mappa le classi Model ai nomi delle tabelle, suggerisco di leggere the doc on that point.

In sostanza, il vostro modello Series sarà simile a quanto segue:

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

    class Meta: 
     managed = False 
     db_table = "legacy_series" 

Poi, potete mettere i vostri comandi SQL, nel file yourapp/sql/series.sql:

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

È quindi possibile syncdb come al solito, e inizia a utilizzare i tuoi modelli precedenti.

Problemi correlati