天天看點

django 1.8 官方文檔翻譯: 2-4-3 模式編輯器模式編輯器

模式編輯器

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。