2014-12-09 13 views
5

bu yapıyı düşünün:Değişiklik sütunu tipi

some_table(id: small int) 

ve bu konuya değiştirmek istiyorum:

Şimdi
some_table(id: string) 

Üç göçler ile bunu:

  1. oluştur tipi dize
  2. (datamigratio ile yeni bir sütun _id dize dönüşüm ile _id için id den n) kopyalama veri
  3. Kaldır kimliği ve adlandırmak _id tek göç bunu yapmanın bir yolu var mı id

için?

cevap

7

doğrudan dize int Bir sütunun türünü değiştirebilirsiniz. Kesin sql modu etkinleştirilmediyse, tamsayılar maksimum dize uzunluğuna kesilecek ve veri muhtemelen kaybedilecektir, bu yüzden her zaman bir yedekleme yapın ve yeterince yüksek bir max_length seçin. Ayrıca, geçiş kolayca tersine çevrilemez (sql, bir dize sütunu doğrudan bir int sütununa değiştirmeyi doğrudan desteklemez), bu nedenle bir yedekleme gerçekten önemlidir. Sen db.alter_column kullanabilirsiniz

Django 1.7/Güney

pre. İlk olarak, bir göç oluşturmak, ancak henüz geçerli olmayan veya veri kaybedersiniz: Sonra

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

, bu işe forwards yöntemini değiştirmek:

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

Bu sütun değiştirecek yeni CharField alanını eşleştirmek için. Şimdi geçişi uygula ve işin bitti.

Django 1.7 Bu sütunu değiştirmek için AlterField işlemini kullanabilirsiniz. eklemek, sonra aşağıdaki işlemi

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

: Birincisi, boş oluşturup taşıma

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

Şimdi göç çalıştırın ve Django yeni CharField maç için alan değiştirecek.

İlgili konular