Non sono un esperto di Django (ho fatto uno o due progetti di dimensioni moderate e, anni fa, ho fatto alcuni Rails), ma per quanto ne so:
As someone new to Django how common/acceptable is it to build your DB first and then use inspectdb to generate the models?
Va bene. Il progetto Django fornisce e documenti inspectdb, quindi non c'è niente di sbagliato nell'usarlo.
Also inevitably your DB structure will change as you go through development, what are the best practices to deal with this and making sure the layers stay in sync.
Le versioni correnti di Django forniscono migrazioni, proprio come fa Rails. Vedi i documenti ufficiali o vari tutorial, come questo . In sostanza:
- Esegui
./manage.py makemigrations
per creare le tue migrazioni. Django creerà automaticamente il codice Python per configurare un database in modo che corrisponda ai tuoi modelli Django.
- Esegui
./manage.py migrate
per applicare le tue migrazioni.
- Ogni volta che hai cambiato i tuoi modelli, esegui
./manage.py makemigrations
. Django ispezionerà automaticamente i tuoi modelli Django, vedrà cosa è cambiato dall'ultima volta che è stato eseguito e genererà il codice Python per sincronizzare il database con le modifiche del tuo modello.
Tieni presente che, se hai eseguito il inspectdb
, i modelli generati hanno managed=False
, quindi sono esclusi dalla logica di migrazione di Django. Mi piacciono molto le migrazioni, quindi dopo essermi assicurato che i miei modelli creati da inspectdb fossero buoni, avrei impostato managed=True
e lasciato che Django gestisse i modelli da lì in poi. (Non ho esperienza con questo per sapere come funziona.)
How does syncing the DB and Django affect data existing in the DB too
Le migrazioni modificano il database sul posto (come se si stessero emettendo manualmente comandi ALTER TABLE
o qualsiasi altra cosa), quindi i dati vengono lasciati soli laddove possibile. Modifiche come l'aggiunta di una colonna potrebbero richiedere nuovi dati di default (Django può avvisarti se necessario); modifiche come la caduta di una colonna ovviamente perderanno dati.