django syncdb e un modello aggiornato


86

Di recente ho aggiornato il mio modello, aggiunto un BooleanField ad esso, tuttavia quando lo faccio python manage.py syncdb, non aggiunge il nuovo campo al database per il modello. Come posso risolvere questo problema?


17
Il fatto che Django non supporti una cosa così fondamentale fuori dagli schemi mi ha impedito di usarla per creare modelli. Il fatto che considerino un ORM che gestisce la creazione della tabella ma non la modifica (sul posto) della tabella come qualità di rilascio mi ha quasi impedito di utilizzare completamente Django.
Glenn Maynard,

3
Il fatto che Django consenta una connettività di app così grande rende Django fantastico e rende la sua mancanza di supporto integrato per la modifica della tabella sostanzialmente irrilevante. Quanto è difficile installare un'app?
Dominic Rodger

@Glenn, pianifica correttamente i tuoi modelli durante la fase di progettazione e non avrai questo problema. Se stai aggiungendo nuove funzionalità, utilizza una suite di migrazione come South. Le migrazioni sul posto sono spesso complicate; comunque troppo complicato per un semplice comando di gestione di Django.
Soviut

Risposte:


100

Da Django 1.7 in poi

Django ha il supporto integrato per le migrazioni: dai un'occhiata alla documentazione .

Per Django 1.6 e versioni precedenti

Django non supporta le migrazioni pronte all'uso. C'è un'app collegabile per Django che fa esattamente questo, e funziona alla grande. Si chiama Sud .


1
Nota: ho avuto problemi a utilizzare South per la migrazione di modelli con un backend db personalizzato (come django-mssql)
Don

1
Il sud è molto molto bello! Grazie per la punta
Julien Greard

14

Django attualmente non lo fa automaticamente. Le tue opzioni sono:

  1. Elimina la tabella dal database, quindi ricreala in una nuova forma utilizzando syncdb.
  2. Stampa SQL per il database usando python manage.py sql (appname), trova la riga aggiunta per il campo e aggiungila manualmente usandoalter table comando SQL. (Ciò ti consentirà anche di scegliere i valori del campo per i tuoi record correnti.)
  3. Usa il sud (secondo la risposta di Dominic ).

11

Segui questi passi:

  1. Esporta i tuoi dati su un dispositivo utilizzando il file dumpdata comando di gestione
  2. Lascia cadere il tavolo
  3. Esegui syncdb
  4. Ricarica i tuoi dati dalla fixture utilizzando il comando di gestione loaddata

Un rilascio completo e una ricarica per qualcosa che dovrebbe essere fatto sul posto? È terribile.
Glenn Maynard,

3
È un semplice comando di gestione, non una suite di migrazione! Django non ha modo di prevedere come sono cambiati i tuoi dati o come conservarli, quindi insiste che tu lo faccia da solo. Se non ti piace, usa uno strumento di migrazione come South.
Soviut

8

Come suggerito nella risposta in alto, ho provato a utilizzare South , e dopo un'ora di frustrazione con oscuri errori di migrazione ho deciso di andare con Django Evolution invece.

Penso che sia più facile iniziare con South, e ha funzionato perfettamente la prima volta che ho digitato ./manage.py evolve --hint --execute, quindi sono contento.


7
Dopo aver utilizzato Django Evolution e South per quasi un anno, cambio opinione. Il sud è fantastico. Ma è molto simile a Git, nel senso che devi assicurarti di capire davvero come funziona . Se stai digitando i comandi alla cieca, molto probabilmente sbaglierai la prima volta che tu o qualcuno della tua squadra commettete un errore.
Dan Abramov,

2

Non ho usato django per un po ', ma mi sembra di ricordare che syncdb esegue comandi di alterazione sulle tabelle db. devi rilasciare la tabella, quindi eseguire di nuovo e verrà creata di nuovo.

modifica: scusa NON esegue alter.


Quindi non esegue alter tablecomandi, esegue create tablecomandi.
Dominic Rodger,

beh, ho dati nel db quindi sarebbe fantastico se superassi questo problema senza cadere.
Hellnar

1
Penso che tu voglia dire che syncdb NON esegue comandi di alterazione. Non è necessario eliminare la tabella, è possibile aggiungere manualmente anche il nuovo campo al proprio sql.
Odif Yltsaeb

sì, ma la domanda faceva riferimento all'uso di syncdb, quindi in questo caso dovresti eliminare la tabella per utilizzare syncdb o utilizzare il plug-in menzionato di seguito.
Alex H

1
Se sei frustrato con South, prova invece Django Evolution. Ha funzionato bene per me. stackoverflow.com/questions/1605662/…
Dan Abramov

1

In django 1.6

  • All'inizio abbiamo eseguito - python manage.py sql <app name>

  • Quindi dobbiamo correre - python manage.py syncdb


0

Se esegui Django con Apache e MySQL, riavvia apache dopo aver eseguito la migrazione con makemigrations .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.