模式編輯器
class BaseDatabaseSchemaEditor[source]
Django的遷移系統分為兩個部分;計算和儲存應該執行什麼操作的邏輯 (
django.db.migrations
) ,以及用于把“建立模型”或者“删除字段”變成SQL語句的資料庫抽象層 – 後者是模式編輯器的功能。
你可能并不想像一個普通的開發者使用Django那樣,直接和模型編輯器進行互動,但是如果你編寫自己的遷移系統,或者有更進一步的需求,這樣會比編寫SQL語句更友善。
每個Django的資料庫後端都提供了它們自己的模式編輯器,并且總是可以通過
connection.schema_editor()
上下文管理器來通路。
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(MyModel)
它必須通過上下文管理器來使用,因為這樣可以管理一些類似于事務和延遲SQL(比如建立
ForeignKey
限制)的東西。
它會暴露所有可能的操作作為方法,這些方法應該按照執行修改的順序調用。可能一些操作或者類型并不可用于所有資料庫 – 例如,MyISAM引擎不支援外鍵限制。
如果你在為Django編寫一個三方的資料庫後端,你需要提供
SchemaEditor
實作來使用1.7的遷移功能 – 然而,隻要你的資料庫在SQL的使用和關系設計上遵循标準,你就應該能夠派生Django内建的
SchemaEditor
之一,然後簡單調整一下文法。同時也要注意,有一些新的資料庫特性是遷移所需要的:
can_rollback_ddl
和
supports_combined_alters
都很重要。
方法
execute
BaseDatabaseSchemaEditor.execute(sql, params=[])[source]
執行傳入的 SQL語句,如果提供了參數則會帶上它們。這是對普通資料庫遊标的一個簡單封裝,如果使用者希望的話,它可以從
.sql
檔案中擷取SQL。
create_model
BaseDatabaseSchemaEditor.create_model(model)[source]
為提供的模型在資料庫中建立新的表,帶有所需的任何唯一性限制或者索引。
delete_model
BaseDatabaseSchemaEditor.delete_model(model)[source]
删除資料庫中的模型的表,以及它帶有的任何唯一性限制或者索引。
alter_unique_together
BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)[source]
修改模型的
unique_together
值;這會向模型表中添加或者删除唯一性限制,使它們比對新的值。
alter_index_together
BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)[source]
index_together
值;這會向模型表中添加或者删除索引,使它們比對新的值。
alter_db_table
BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)[source]
重命名模型的表,從
old_db_table
變成
new_db_table
。
alter_db_tablespace
BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)[source]
把模型的表從一個表空間移動到另一個中。
add_field
BaseDatabaseSchemaEditor.add_field(model, field)[source]
向模型的表中添加一列(或者有時幾列),表示新增的字段。如果該字段帶有
db_index=True
或者
unique=True
,同時會添加索引或者唯一性限制。
如果字段為
ManyToManyField并
且缺少
through
值,會建立一個表來表示關系,而不是建立一列。如果提供了
through
值,就什麼也不做。
ForeignKey
,同時會向列上添加一個外鍵限制。
remove_field
BaseDatabaseSchemaEditor.remove_field(model, field)[source]
從模型的表中移除代表字段的列,以及列上的任何唯一性限制,外鍵限制,或者索引。
如果字段是
ManyToManyField
并且缺少
through
值,會移除建立用來跟蹤關系的表。如果提供了
through
alter_field
BaseDatabaseSchemaEditor.alter_field(model, old_field, new_field, strict=False)[source]
這會将模型的字段從舊的字段轉換為新的。這包括列名稱的修改(
db_column
屬性)、字段類型的修改(如果修改了字段類)、字段
NULL
狀态的修改、添加或者删除字段層面的唯一性限制和索引、修改主鍵、以及修改
ForeignKey
限制的目标。
最普遍的一個不能實作的轉換,是把
ManyToManyField
變成一個普通的字段,反之亦然;Django不能在不丢失資料的情況下執行這個轉換,是以會拒絕這樣做。作為替代,應該單獨調用
remove_field()
add_field()
如果資料庫滿足
supports_combined_alters
,Django會盡可能在單次資料庫調用中執行所有這些操作。否則對于每個變更,都會執行一個單獨的
ALTER
語句,但是如果不需要做任何改變,則不執行
ALTER
(就像South經常做的那樣)。
屬性
除非另有規定,所有屬性都應該是隻讀的。
connection
SchemaEditor.connection
一個到資料庫的連接配接對象。
alias
是
connection
的一個實用的屬性,它用于決定要通路的資料庫的名字。
當你
在多種資料庫之間執行遷移的時候,這是非常有用的。
譯者: Django 文檔協作翻譯小組 ,原文: SchemaEditor 本文以 CC BY-NC-SA 3.0 協定釋出,轉載請保留作者署名和文章出處。 人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。