SchemaEditor —Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/schema-editor
移動先:案内検索

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)

indexmodelのテーブルに追加します。


remove_index()

BaseDatabaseSchemaEditor.remove_index(model, index)

modelのテーブルからindexを削除します。


add_constraint()

BaseDatabaseSchemaEditor.add_constraint(model, constraint)

constraintmodelのテーブルに追加します。


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であり、これを使用して、アクセスされているデータベースの名前を判別できます。

これは、複数のデータベースを使用した移行のデータ移行を行う場合に役立ちます。