SchemaEditor
- class BaseDatabaseSchemaEditor
Djangoの移行システムは2つの部分に分かれています。 実行する操作を計算して保存するためのロジック(django.db.migrations
)、および「モデルの作成」や「フィールドの削除」などをSQLに変換するデータベース抽象化レイヤー-これは[の仕事ですX262X] 。
Djangoを使用して通常の開発者としてSchemaEditor
と直接対話することはまずありませんが、独自の移行システムを作成する場合、またはより高度なニーズがある場合は、SQLを作成するよりもはるかに優れています。
Djangoの各データベースバックエンドは独自のバージョンのSchemaEditor
を提供し、connection.schema_editor()
コンテキストマネージャーを介して常にアクセスできます。
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(MyModel)
トランザクションや遅延SQL(ForeignKey
制約の作成など)などを管理できるため、コンテキストマネージャーを介して使用する必要があります。
可能なすべての操作をメソッドとして公開します。メソッドは、変更を適用する順序で呼び出す必要があります。 一部の可能な操作または変更の種類は、すべてのデータベースで可能ではありません。たとえば、MyISAMは外部キー制約をサポートしていません。
Django用のサードパーティデータベースバックエンドを作成または保守している場合、Djangoの移行機能を使用するには、SchemaEditor
実装を提供する必要があります。ただし、データベースの使用が比較的標準的である限り、 SQLとリレーショナル設計の場合、組み込みのDjango SchemaEditor
クラスの1つをサブクラス化し、構文を少し調整できるはずです。
メソッド
execute()
- BaseDatabaseSchemaEditor.execute(sql, params=())
渡されたSQLステートメントを、指定されている場合はパラメーターを使用して実行します。 これは、ユーザーが望む場合にSQLを.sql
ファイルにキャプチャできるようにする通常のデータベースカーソルのラッパーです。
create_model()
- BaseDatabaseSchemaEditor.create_model(model)
提供されたモデルのデータベースに、必要な一意の制約またはインデックスとともに新しいテーブルを作成します。
delete_model()
- BaseDatabaseSchemaEditor.delete_model(model)
モデルのテーブルを、固有の制約またはインデックスとともにデータベースにドロップします。
add_index()
- BaseDatabaseSchemaEditor.add_index(model, index)
index
をmodel
のテーブルに追加します。
remove_index()
- BaseDatabaseSchemaEditor.remove_index(model, index)
model
のテーブルからindex
を削除します。
add_constraint()
- BaseDatabaseSchemaEditor.add_constraint(model, constraint)
constraint
をmodel
のテーブルに追加します。
remove_constraint()
- BaseDatabaseSchemaEditor.remove_constraint(model, constraint)
model
のテーブルからconstraint
を削除します。
alter_unique_together()
- BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)
モデルの unique_together 値を変更します。 これにより、新しい値と一致するまで、モデルのテーブルに一意の制約が追加または削除されます。
alter_index_together()
- BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)
モデルの index_together 値を変更します。 これにより、新しい値と一致するまで、モデルのテーブルにインデックスが追加または削除されます。
alter_db_table()
- BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)
モデルのテーブルの名前をold_db_table
からnew_db_table
に変更します。
alter_db_tablespace()
- BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)
モデルのテーブルをあるテーブルスペースから別のテーブルスペースに移動します。
add_field()
- BaseDatabaseSchemaEditor.add_field(model, field)
フィールドを表すために、モデルのテーブルに列(または場合によっては複数)を追加します。 これにより、フィールドにdb_index=True
またはunique=True
がある場合、インデックスまたは一意の制約も追加されます。
フィールドがthrough
の値のないManyToManyField
の場合、列を作成する代わりに、関係を表すテーブルを作成します。 through
が提供されている場合、それはノーオペレーションです。
フィールドがForeignKey
の場合、これにより外部キー制約も列に追加されます。
remove_field()
- BaseDatabaseSchemaEditor.remove_field(model, field)
フィールドを表す列を、そのフィールドによって引き起こされた一意の制約、外部キー制約、またはインデックスとともに、モデルのテーブルから削除します。
フィールドがthrough
の値のないManyToManyFieldの場合、関係を追跡するために作成されたテーブルが削除されます。 through
が提供されている場合、それはノーオペレーションです。
alter_field()
- BaseDatabaseSchemaEditor.alter_field(model, old_field, new_field, strict=False)
これにより、モデルのフィールドが古いフィールドから新しいフィールドに変換されます。 これには、列の名前の変更( db_column 属性)、フィールドのタイプの変更(フィールドクラスが変更された場合)、フィールドのNULL
ステータスの変更、追加または削除が含まれます。フィールドのみの一意の制約とインデックス、主キーの変更、およびForeignKey
制約の宛先の変更。
これができない最も一般的な変換は、ManyToManyField
を通常のフィールドに変換することです。 Djangoはデータを失うことなくこれを行うことができないため、それを拒否します。 代わりに、 remove_field()と add_field()を別々に呼び出す必要があります。
データベースにsupports_combined_alters
がある場合、Djangoは1回のデータベース呼び出しでこれらをできるだけ多く実行しようとします。 それ以外の場合は、変更ごとに個別のALTERステートメントを発行しますが、変更が不要な場合はALTERを発行しません。
属性
特に明記されていない限り、すべての属性は読み取り専用と見なす必要があります。
connection
- SchemaEditor.connection
データベースへの接続オブジェクト。 接続の有用な属性はalias
であり、これを使用して、アクセスされているデータベースの名前を判別できます。
これは、複数のデータベースを使用した移行のデータ移行を行う場合に役立ちます。