南-新しいクールな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行のために失敗します。

Source: https://habr.com/ru/post/J47004/


All Articles