Django MySQL 數據庫連接


Django 1.11 官方文檔

常規說明

數據庫連接

CONN_MAX_AGE 定義數據庫連接時限(ALL)

default:0 保存在每個請求結束時關閉數據庫連接的歷史行為。
None:保持長連接
Other:xx 單位秒

連接管理

Django連接發生在每次請求時,如果沒有可用連接便主動建立連接,如果限制了連接時間的話。

警告
  1. 每個線程包含自己的數據庫連接,數據庫必須支持至少和工作線程一樣多的同步連接;
  2. 有時出現大多數視圖無法訪問數據庫,此時應當試圖減少數據庫保持連接時間,這樣不會有意地維護連接,同時有助於減少數據庫同步連接數;
  3. 開發服務器會為每個處理的連接創立新的線程,會使長連接失效;
  4. 當Django建立一個連接時會設置適當的參數(取決於被使用的后端),如果使能長連接,這些設置便不會在每個請求重復設置,但是如果你定義了比如連接隔離或時區,就應在每次連接斷開后還原默認配置,強制寫入適當的值或者禁用長連接。

編碼

Django 默認假設所有數據庫均采用UTF-8編碼。

MySQL連接說明

版本說明

支持MySQL 5.5+,期望數據庫支持UTF-8編碼和事務和參照完整性。

數據庫存儲引擎

推薦引擎---InnoDB

MySQL數據庫API驅動

  1. MySQLdb 原生驅動已被開發支持超過10年(不支持Python3);

  2. mysqlclient MySQLdb的衍生,支持Python3(Django MySQL推薦API);

    mysqlclient 1.3.3+,推薦此API

  3. 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 排序稍慢相對准確

連接數據庫

連接設置采用優先順序:

  1. OPTIONS選項
  2. NAME,USER,PASSWORD,HOST,PORT
  3. 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.

自動類型轉換可能會導致非預期的結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM