南-新しいクールなsyncdb

私は最近Djangoの使用を開始しましたが、ほとんどすぐに同期されなかった欠陥のあるsyncdbコマンドに激怒しました。



また、既存のモデルにフィールドを追加または削除すると、非常に苦痛になります。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行のために失敗します。



All Articles