常規說明
數據庫連接
CONN_MAX_AGE 定義數據庫連接時限(ALL)
default:0 保存在每個請求結束時關閉數據庫連接的歷史行為。
None:保持長連接
Other:xx 單位秒
連接管理
Django連接發生在每次請求時,如果沒有可用連接便主動建立連接,如果限制了連接時間的話。
警告
- 每個線程包含自己的數據庫連接,數據庫必須支持至少和工作線程一樣多的同步連接;
- 有時出現大多數視圖無法訪問數據庫,此時應當試圖減少數據庫保持連接時間,這樣不會有意地維護連接,同時有助於減少數據庫同步連接數;
- 開發服務器會為每個處理的連接創立新的線程,會使長連接失效;
- 當Django建立一個連接時會設置適當的參數(取決於被使用的后端),如果使能長連接,這些設置便不會在每個請求重復設置,但是如果你定義了比如連接隔離或時區,就應在每次連接斷開后還原默認配置,強制寫入適當的值或者禁用長連接。
編碼
Django 默認假設所有數據庫均采用UTF-8編碼。
MySQL連接說明
版本說明
支持MySQL 5.5+,期望數據庫支持UTF-8編碼和事務和參照完整性。
數據庫存儲引擎
推薦引擎---InnoDB
MySQL數據庫API驅動
-
MySQLdb 原生驅動已被開發支持超過10年(不支持Python3);
-
mysqlclient MySQLdb的衍生,支持Python3(Django MySQL推薦API);
mysqlclient 1.3.3+,推薦此API
-
MySQL Connector/Python 純Python驅動(Oracle,支持Python3),無須MySQL客戶端庫和Python其他標准庫;
MySQL connector/Python 1.1.X+
時區定義
使用Django 時區支持,mysql_tzinfo_to_sql加載時區表至MySQL數據庫。
創建數據庫(支持UTF-8)
SQL語句:
CREATE DATABASE <dbname> CHARACTER SET utf8;
排序規則
排序規則用於列序控制,可以設置數據庫范圍級別或單獨表/單獨列級別的排序規則,Django不提供模型設置排序,可手動修改數據庫表進行修改。
默認utf-8數據庫,MySQL采用utf8_general_ci排序規則(默認大小寫不敏感,插入‘a’和‘A’會視為一樣),如果想區分大小寫,請采用utf8_bin排序規則。
utf8_general_ci 排序快有一些誤差
utf8_unicode_ci 排序稍慢相對准確
連接數據庫
連接設置采用優先順序:
- OPTIONS選項
- NAME,USER,PASSWORD,HOST,PORT
- MySQL配置
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': '/path/to/my.cnf',
},
}
}
# my.cnf
[client]
database = NAME
user = USER
password = PASSWORD
default-character-set = utf8
設置sql_mode
STRICT_TRANS_TABLES/STRICT_ALL_TABLES
Django 強烈建議激活strict mode(此模式會將插入時的truncate警告升級為錯誤,以此來防止數據丟失)
隔離等級Isolation level
當運行並發負載時,數據庫會處理不同的回話可能會相互影響。相互影響方式由每個回話的處理隔離等級決定。在數據庫配置文件OPTIONS中設置isolation_level,有效的設置值如下:
- 'read uncommitted'
- 'read comitted'
- 'repeatable read'
- 'serializable'
- 'None'
Django 在'read committed'工作好於MySQL默認'repeatable read'。
創建表
提前設置好數據庫存儲引擎
表名
推薦使用小寫
特殊區域注意事項
字符域
字符域默認為最大255字符,如果使用unique=True將會影響字符域。
TextField 限制
TextField不能標記為 unique=True
小數秒在Time和DataTime Field被支持
要求MySQL 5.6.4+
TIMESTAMP 列
如果數據庫包含TIMESTAMP列,必須設置USE_TZ = False來避免沖突,如果你使能為True,則inspectdb會映射這些列到DateTimeField,MySQL和Django都將會嘗試從UTC到local time轉換這些值。
Row locking with QuerySet.select_for_update()
MySQL不支持NOWAIT和SKIP LOCKED,
故select_for_update() is used with nowait=True or skip_locked=True then a DatabaseError will be raised.