2014-12-09 10 views
5

Rozważmy tę strukturę:Zmień typ kolumny z migracjami django

some_table(id: small int) 

i chcę zmienić go na to:

some_table(id: string) 

Teraz robię to z trzema migracji:

  1. Tworzenie nowa kolumna _id z ciągiem znaków
  2. (datamigratio Dane n) Kopiowanie z id do _id z konwersją strun
  3. Usuń id i zmienić _id do id

Czy istnieje sposób, aby to zrobić tylko z jednym migracji?

Odpowiedz

7

Możesz bezpośrednio zmienić typ kolumny z int na ciąg. Zwróć uwagę, że jeśli nie jest włączony ścisły tryb sql, liczby całkowite zostaną obcięte do maksymalnej długości łańcucha, a dane zostaną prawdopodobnie utracone, więc zawsze rób kopie zapasowe i wybierz odpowiednio wysoki poziom. Ponadto migracja nie może być łatwo odwrócona (sql nie obsługuje bezpośrednio zmiany kolumny w kolumnie int), więc kopia zapasowa jest w tym przypadku bardzo ważna.

Django pre 1.7/South

Można użyć db.alter_column. Najpierw utwórz migracji, ale nie stosuje się go jeszcze, albo stracisz dane:

>>> python manage.py schemamigration my_app --auto 

Następnie zmień metodę forwards w tym:

class Migration(SchemaMigration): 
    def forwards(self, orm): 
     db.alter_column('some_table', 'id', models.CharField(max_length=255)) 

    def backwards(self, orm): 
     raise RuntimeError('Cannot reverse this migration.') 

to zmieni kolumnę aby dopasować nowe pole CharField. Teraz zastosuj migrację i gotowe. Aby zmienić kolumnę, można użyć operacji AlterField. Po pierwsze, należy utworzyć pusty migracji:

>>> python manage.py makemigrations --empty my_app 

Następnie dodaj następującą operację:

class Migration(migrations.Migration): 
    operations = [ 
     migrations.AlterField('some_model', 'id', models.CharField(max_length=255)) 
    ] 

teraz uruchomić migrację i Django zmieni pole pasujące do nowego CharField.

Powiązane problemy