class BaseDatabaseSchemaEditor[source]
html
Django的遷移系統分爲兩個部分;計算和儲存應該執行什麼操做的邏輯 (django.db.migrations
) ,以及用於把「建立模型」或者「刪除字段」變成SQL語句的數據庫抽象層 -- 後者是模式編輯器的功能。python
你可能並不想像一個普通的開發者使用Django那樣,直接和模型編輯器進行交互,可是若是你編寫本身的遷移系統,或者有更進一步的需求,這樣會比編寫SQL語句更方便。sql
每一個Django的數據庫後端都提供了它們本身的模式編輯器,而且老是能夠經過connection.schema_editor()
上下文管理器來訪問。數據庫
with connection.schema_editor() as schema_editor: schema_editor.delete_model(MyModel)
它必須經過上下文管理器來使用,由於這樣能夠管理一些相似於事務和延遲SQL(好比建立ForeignKey
約束)的東西。django
它會暴露全部可能的操做做爲方法,這些方法應該按照執行修改的順序調用。可能一些操做或者類型並不可用於全部數據庫 -- 例如,MyISAM引擎不支持外鍵約束。後端
若是你在爲Django編寫一個三方的數據庫後端,你須要提供SchemaEditor
實現來使用1.7的遷移功能 -- 然而,只要你的數據庫在SQL的使用和關係設計上遵循標準,你就應該可以派生Django內建的SchemaEditor
之一,而後簡單調整一下語法。同時也要注意,有一些新的數據庫特性是遷移所須要的:can_rollback_ddl
和supports_combined_alters
都很重要。編輯器
BaseDatabaseSchemaEditor.execute(sql, params=[])[source]
spa
執行傳入的 SQL語句,若是提供了參數則會帶上它們。這是對普通數據庫遊標的一個簡單封裝,若是用戶但願的話,它能夠從.sql
文件中獲取SQL。翻譯
BaseDatabaseSchemaEditor.create_model(model)[source]
設計
爲提供的模型在數據庫中建立新的表,帶有所需的任何惟一性約束或者索引。
BaseDatabaseSchemaEditor.delete_model(model)[source]
刪除數據庫中的模型的表,以及它帶有的任何惟一性約束或者索引。
BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)[source]
修改模型的unique_together
值;這會向模型表中添加或者刪除惟一性約束,使它們匹配新的值。
BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)[source]
修改模型的 index_together
值;這會向模型表中添加或者刪除索引,使它們匹配新的值。
BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)[source]
重命名模型的表,從old_db_table
變成new_db_table
。
BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)[source]
把模型的表從一個表空間移動到另外一箇中。
BaseDatabaseSchemaEditor.add_field(model, field)[source]
向模型的表中添加一列(或者有時幾列),表示新增的字段。若是該字段帶有db_index=True
或者 unique=True
,同時會添加索引或者惟一性約束。
若是字段爲ManyToManyField並
且缺乏 through
值,會建立一個表來表示關係,而不是建立一列。若是提供了through
值,就什麼也不作。
若是字段爲ForeignKey
,同時會向列上添加一個外鍵約束。
BaseDatabaseSchemaEditor.remove_field(model, field)[source]
從模型的表中移除表明字段的列,以及列上的任何惟一性約束,外鍵約束,或者索引。
若是字段是ManyToManyField
而且缺乏through
值,會移除建立用來跟蹤關係的表。若是提供了through
值,就什麼也不作。
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常常作的那樣)。
除非另有規定,全部屬性都應該是隻讀的。
SchemaEditor.connection
一個到數據庫的鏈接對象。alias
是connection
的一個實用的屬性,它用於決定要訪問的數據庫的名字。
當你在多種數據庫之間執行遷移的時候,這是很是有用的。
譯者:Django 文檔協做翻譯小組,原文:SchemaEditor。
本文以 CC BY-NC-SA 3.0 協議發佈,轉載請保留做者署名和文章出處。
Django 文檔協做翻譯小組人手緊缺,有興趣的朋友能夠加入咱們,徹底公益性質。交流羣:467338606。