また、既存のモデルにフィールドを追加または削除すると、非常に苦痛になります。ORMがテーブル(manage.py sqlall)を再度作成する方法を「覗き」、変更されたテーブル列に対してALTER TABLEを手動で行う必要があります。
つまり、DjangoのORMは、プロトタイプ作成プロセス中にモデルのこれらのフィールドが単純にバッチで変更されるため、何らかの方法でSQLシェルと積極的に連携します。
グーグルで、データベーススキーマへの変更を自動化するいくつかの方法を見つけ、最終的には南に落ち着きました。 このユーティリティは、dbスキーマの移行プロセスを自動化します。 (ユーティリティの名前は、私が理解しているように、「移行」という用語に勝っています。結局のところ、冬にはすべての鳥が飛びます:))。
Southを選択した理由は、移行の履歴を保持しており、元に戻す/やり直しができ、移行コードを手動で調整できるからです。
完全なチュートリアルは、 south.aeracode.org / wiki / Tutorialにあります。その仕組みについて簡単に説明します。
設置
1.ここからユーティリティコードをマージします: https : //svn.aeracode.org/svn/south/trunk
2. python / lib / site-packagesまたはそれが見える他の場所に置きます
3. settings.INSTALLED_APPSに「south」を追加します
4.通常のmanage.py syncdbを作成し、それが何らかの形で異なっていることを確認します
使用する
ここで状況を想像してください。既存のモデルでは、いくつかのフィールドを追加する必要があります。 たとえば、次のとおりです。
class CompanyProduct (models.Model):
# .. -, - ..
download_url = models.URLField (
u ' ' ,
blank = True, null = True)
system_requirements = models.TextField (
u ' ' ,
blank = True, null = True)
* This source code was highlighted with Source Code Highlighter .
移行を作成します。
python manage.py startmigration [__app] add_download_section
--add-field CompanyProduct.download_url
--add-field CompanyProduct.system_requirements
Creating __init__.py in '[path_to_app]\migrations'...
Created 0001_add_download_section.py.
適用します:
python manage.py migrate [__app]
Running migrations for [__app]:
- Migrating forwards to 0001_add_download_section.
> [__app]: 0001_add_download_section
= ALTER TABLE "products" ADD COLUMN "download_url" varchar (200) NULL ; []
= ALTER TABLE "products" ADD COLUMN "system_requirements" text NULL ; []
- Loading initial data for [__app].
科学的な好奇心に駆られ、0001_add_download_section.pyでSouthが生成したものを見てください:
from south.db import db
from django.db import models
from [__app].models import *
class Migration:
def forwards(self):
# Adding field 'CompanyProduct.download_url'
db.add_column( 'products' , 'download_url' ,
models.URLField (u ' ' , blank = True, null = True))
# Adding field 'CompanyProduct.system_requirements'
db.add_column( 'products' , 'system_requirements' ,
models.TextField (u ' ' , blank = True, null = True))
def backwards(self):
# Deleting field 'CompanyProduct.download_url'
db.delete_column( 'products' , 'download_url' )
# Deleting field 'CompanyProduct.system_requirements'
db.delete_column( 'products' , 'system_requirements' )
カント
私の場合、ファイル「/south/management/commands/startmigration.py、290行目」を参照して、出力「#coding = utf-8」を移行スクリプトの先頭に追加する必要がありました。追加しないと、Unicode行のために失敗します。