# 模式編輯器 #
`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`的一個實用的屬性,它用于決定要訪問的數據庫的名字。
當你[在多種數據庫之間執行遷移](http://python.usyiyi.cn/django/howto/writing-migrations.html#data-migrations-and-multiple-databases)的時候,這是非常有用的。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[SchemaEditor](https://docs.djangoproject.com/en/1.8/ref/schema-editor/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架