SchemaEditor
¶
Django 的遷移系統分為兩個部分:計算和儲存應執行哪些操作的邏輯 (django.db.migrations
),以及將「建立模型」或「刪除欄位」等操作轉換為 SQL 的資料庫抽象層 - 這正是 SchemaEditor
的工作。
作為使用 Django 的一般開發者,您不太可能需要直接與 SchemaEditor
互動,但如果您想編寫自己的遷移系統,或有更進階的需求,它比編寫 SQL 方便得多。
Django 中的每個資料庫後端都會提供自己的 SchemaEditor
版本,並且始終可以通過 connection.schema_editor()
環境管理器存取
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(MyModel)
它必須通過環境管理器使用,因為這允許它管理事務和延遲的 SQL(例如建立 ForeignKey
限制)。
它將所有可能的操作公開為方法,這些方法應按您希望應用變更的順序調用。某些操作或變更類型並非在所有資料庫上都可行 - 例如,MyISAM 不支援外鍵限制。
如果您正在編寫或維護 Django 的第三方資料庫後端,您將需要提供一個 SchemaEditor
實作才能使用 Django 的遷移功能 - 但是,只要您的資料庫在 SQL 和關聯式設計的使用上相對標準,您應該能夠子類化其中一個內建的 Django SchemaEditor
類別,並稍微調整語法。
方法¶
execute()
¶
執行傳入的 SQL 陳述式,如果提供參數則一併傳入。這是對標準資料庫遊標的包裝,允許將 SQL 捕獲到 .sql
檔案中(如果使用者希望如此)。
create_model()
¶
為提供的模型在資料庫中建立一個新表格,以及它需要的任何唯一限制或索引。
delete_model()
¶
在資料庫中刪除模型的表格以及它擁有的任何唯一限制或索引。
add_index()
¶
將 index
新增至 model
的表格。
remove_index()
¶
從 model
的表格中移除 index
。
rename_index()
¶
將 model
的表格中的 old_index
重新命名為 new_index
。
add_constraint()
¶
將 constraint
新增至 model
的表格。
remove_constraint()
¶
從 model
的表格中移除 constraint
。
alter_unique_together()
¶
- BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)[原始碼]¶
變更模型的 unique_together
值;這將從模型的表格中新增或移除唯一限制,直到它們與新值相符。
alter_index_together()
¶
變更模型的 index_together
值;這將從模型的表格中新增或移除索引,直到它們與新值相符。
alter_db_table()
¶
將模型的表格從 old_db_table
重新命名為 new_db_table
。
alter_db_table_comment()
¶
- BaseDatabaseSchemaEditor.alter_db_table_comment(model, old_db_table_comment, new_db_table_comment)[原始碼]¶
將 model
的表格註解變更為 new_db_table_comment
。
alter_db_tablespace()
¶
將模型的資料表從一個表空間移動到另一個表空間。
add_field()
¶
在模型的資料表中新增一個(或有時是多個)欄位來表示該欄位。如果欄位具有 db_index=True
或 unique=True
,這也會新增索引或唯一約束。
如果欄位是一個沒有 through
值的 ManyToManyField
,它會建立一個表格來表示關係,而不是建立欄位。如果提供了 through
,則不會執行任何操作。
如果欄位是一個 ForeignKey
,這也會將外鍵約束新增到該欄位。
remove_field()
¶
從模型的資料表中移除表示該欄位的欄位,以及由該欄位引起的任何唯一約束、外鍵約束或索引。
如果欄位是一個沒有 through
值的 ManyToManyField,它會移除為追蹤關係而建立的表格。如果提供了 through
,則不會執行任何操作。
alter_field()
¶
此方法將模型上的欄位從舊欄位轉換為新欄位。這包括變更欄位的名稱(db_column
屬性)、變更欄位的類型(如果欄位類別變更)、變更欄位的 NULL
狀態、新增或移除僅限欄位的唯一約束和索引、變更主鍵以及變更 ForeignKey
約束的目的地。
最常見的此方法無法完成的轉換是將 ManyToManyField
轉換為一般的欄位,或反之亦然;在不遺失資料的情況下,Django 無法執行此操作,因此它會拒絕執行。相反地,應該分別呼叫 remove_field()
和 add_field()
。
如果資料庫具有 supports_combined_alters
,Django 會嘗試在單一資料庫呼叫中執行盡可能多的這些變更;否則,它會針對每個變更發出單獨的 ALTER 陳述式,但不會在不需要變更時發出 ALTER 陳述式。
屬性¶
所有屬性都應視為唯讀,除非另有說明。
connection
¶
- SchemaEditor.connection¶
到資料庫的連線物件。連線的一個有用的屬性是 alias
,可用於判斷正在存取的資料庫名稱。
當為 具有多個資料庫的遷移 執行資料遷移時,這非常有用。