2014-12-09 11 views
5

Betrachten Sie diese Struktur:ändern Spaltentyp mit django Migrationen

some_table(id: small int) 

und ich möchte es dies ändern:

some_table(id: string) 

Jetzt mache ich dies mit drei Migrationen:

  1. erstellen eine neue Spalte _id mit Typ string
  2. (datamigratio n) Daten kopieren id-_id mit String-Konvertierung
  3. Remove-ID und benennen _id zu id

Gibt es eine Möglichkeit, dies mit nur einer Migration zu tun?

Antwort

7

Sie können direkt den Typ eines von int String-Spalte ändern. Beachten Sie, dass, es sei denn, die strikte SQL-Modus aktiviert ist, werden ganze Zahlen auf die maximale Stringlänge und Daten abgeschnitten werden, möglicherweise verloren, so dass immer ein Backup machen und ein max_length wählen, die hoch genug ist. Auch kann die Migration nicht leicht rückgängig gemacht werden (SQL direkt unterstützt keine String-Spalte in einem int Spalt zu ändern), so dass ein Backup ist wirklich wichtig in dieser.

Django Pre 1.7/Süd

Sie db.alter_column verwenden können. Erstens, eine Migration erstellen, aber gelten sie noch nicht, oder Sie werden die Daten verlieren:

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

Dann ändern Sie die forwards Methode in diese:

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.') 

Dies verändert die Spalte das neue CharField Feld anzupassen. Jetzt wenden Sie die Migration an und Sie sind fertig.

Django 1.7 können Sie verwenden, um die AlterField Betrieb die Spalte zu ändern. Erstellen Sie zunächst eine leere Migration:

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

Dann fügen Sie den folgenden Vorgang:

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

nun die Migration ausführen, und Django wird das Feld ändern, um die neuen CharField anzupassen.