SchemaEditor

class BaseDatabaseSchemaEditor[原始碼]

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()

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

rename_index()

BaseDatabaseSchemaEditor.rename_index(model, old_index, new_index)[原始碼]

model 的表格中的 old_index 重新命名為 new_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_table_comment()

BaseDatabaseSchemaEditor.alter_db_table_comment(model, old_db_table_comment, new_db_table_comment)[原始碼]

model 的表格註解變更為 new_db_table_comment

alter_db_tablespace()

BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)[原始碼]

將模型的資料表從一個表空間移動到另一個表空間。

add_field()

BaseDatabaseSchemaEditor.add_field(model, field)[原始碼]

在模型的資料表中新增一個(或有時是多個)欄位來表示該欄位。如果欄位具有 db_index=Trueunique=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 會嘗試在單一資料庫呼叫中執行盡可能多的這些變更;否則,它會針對每個變更發出單獨的 ALTER 陳述式,但不會在不需要變更時發出 ALTER 陳述式。

屬性

所有屬性都應視為唯讀,除非另有說明。

connection

SchemaEditor.connection

到資料庫的連線物件。連線的一個有用的屬性是 alias,可用於判斷正在存取的資料庫名稱。

當為 具有多個資料庫的遷移 執行資料遷移時,這非常有用。

返回頂端