Django と South と カラム名変更
South でカラム名を変更したい
class Example(models.Model): hoge = models.TextField()
こんなモデルの hoge を huga に変えたいとします。
class Example(models.Model): huga = models.TextField() # hoge → huga
こういう場合普通に schemamigration をすると South は add して delete します。
class Migration(SchemaMigration): def forwards(self, orm): # Adding field 'Example.huga' db.add_column('example', 'huga', self.gf('django.db.models.fields.TextField')()) # Deleting field 'Exsample.hoge' db.delete_column(u'example', 'hoge') # backwards以下省略
自動ではカラム名を変更すべきかどうかわからないので、しょうがないですね。
hoge にデータがない場合はこのままでも良いのですが、データがある場合は delete しちゃうと困ります。
こんな時はモデルを変更した後に schemamigration じゃなくて datamigration をします。
そうすると、こんなファイルが出来るので
class Migration(SchemaMigration): def forwards(self, orm): "Write your forwards methods here." # backwards以下省略
db.rename_column でカラム名を変更します。
class Migration(SchemaMigration): def forwards(self, orm): db.rename_column('example', 'hoge', 'huga') # backwards以下省略
カラム名の変更以外にも schemamigration で上手く行かなかった場合は、datamigration で Database API を使って自前で migration を書くことを考えると良いと思います。
こんなの書いたけど
とうとう South が Django に取込まれるみたいです。
https://speakerdeck.com/andrewgodwin/migrating-the-future
なので、すぐに使えなくなる知識かもしれません。
ですが、South なしの Django とか使う気にならないので、取込まれるのが楽しみです!