Django下配置使用 mysql 數據庫
-
安裝 pymysql包
$ sudo pip3 install pymysql
-
安裝 mysql 客戶端(非必須)
$ sudo pip3 install mysqlclient
-
創建和配置數據庫
-
創建數據庫
create database 數據庫名 default charset utf8 collate utf8_general_ci;
如:create database mywebdb default charset utf8 collate utf8_general_ci;
-
數據庫的配置
-
sqlite 數據庫配置
# file: settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
-
mysql 數據庫配置
DATABASES = { 'default' : { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mywebdb', # 數據庫名稱,需要自己定義 'USER': 'root', 'PASSWORD': 'root', # 管理員密碼 'HOST': '127.0.0.1', 'PORT': 3306, } }
-
-
關於數據庫的SETTING配置
ENGINE
指定數據庫的後端引擎'django.db.backends.mysql' 'django.db.backends.sqlite3' 'django.db.backends.oracle' 'django.db.backends.postgresql'
NAME
指定要連接的數據庫的名稱
'NAME': 'mywebdb'
USER
指定登錄到數據庫的用戶名
'USER':'root'
PASSWORD
接數據庫時使用的密碼。
'PASSWORD':'123456'
HOST
連接數據庫時使用哪個主機。
'HOST':'127.0.0.1'
PORT
連接數據庫時使用的端口。
'PORT':'3306'
-
添加 mysql 支持
修改項目中__init__.py
加入如下內容來提供pymysql引擎的支持import pymysql pymysql.install_as_MySQLdb()
-
模型(Models)
- 模型是一個Python類,它是由
django.db.models.Model
派生出的子類。 - 一個模型類代表數據庫中的一張數據表
- 模型類中每一個類屬性都代表數據庫中的一個字段。
- 模型是數據交互的接口,是表示和操作數據庫的方法和方式
Django 的 ORM框架
- ORM(Object Relational Mapping)即對象關係映射,它是一種程序技術,它允許你
使用類和對象對數據庫進行操作
,從而避免通過SQL語句操作數據庫 - ORM框架的作用
- 建立模型類和表之間的對應關係,通過面向對象的方式來操作數據庫。
- 根據設計的模型類生成數據庫中的表格。
- 通過簡單的配置就可以進行數據庫的切換。
- ORM 好處:
- 只需要面向對象編程, 不需要面向數據庫編寫代碼.
- 對數據庫的操作都轉化成對類屬性和方法的操作.
- 不用編寫各種數據庫的sql語句.
- 實現了數據模型與數據庫的解耦, 屏蔽了不同數據庫操作上的差異.
- 不在關注用的是mysql、oracle…等數據庫的內部細節.
- 通過簡單的配置就可以輕鬆更換數據庫, 而不需要修改代碼.
- 只需要面向對象編程, 不需要面向數據庫編寫代碼.
- ORM 缺點
- 相比較直接使用SQL語句操作數據庫,有性能損失.
- 根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象, 在映射過程中有性能損失.
- ORM 示意
-
模型示例
假設項目中已經添加了一個名爲bookstore的應用,現在爲該應用添加一個模型類代表圖書的信息。# file : bookstore/models.py from django.db import models class Book(models.Model): title = models.CharField("書名", max_length=50, default='') price = models.DecimalField('定價', max_digits=7, decimal_places=2, default=0.0)
模型類名
是數據表名的一部分,建議類名首字母大寫
字段名
又是當前類的類屬性名,此名稱將作爲數據表的字段名
字段類型
用來映射到數據表中的字段的類型
字段選項
爲這些字段提供附加的參數信息 -
字段類型
-
BooleanField()
數據庫類型:tinyint(1)
編程語言中:使用True或False來表示值
在數據庫中:使用1或0來表示具體的值 -
CharField()
數據庫類型:varchar
必須要指定max_length
參數值
-
-
DateField()
數據庫類型:date
作用:表示日期
編程語言中:使用字符串來表示具體值- 參數:
DateField.auto_now
: 每次保存對象時,自動設置該字段爲當前時間(取值:True/False)。
DateField.auto_now_add
: 當對象第一次被創建時自動設置當前時間(取值:True/False)。
DateField.default
: 設置當前時間(取值:字符串格式時間如: ‘2019-6-1’)。
以上三個參數只能多選一
- 參數:
-
DateTimeField()
數據庫類型:datetime(16)
作用:表示日期和時間
auto_now_add=True
-
DecimalField()
數據庫類型:decimal(x,y)
編程語言中:使用小數表示該列的值
在數據庫中:使用小數- 參數:
DecimalField.max_digits
: 位數總數,包括小數點後的位數。 該值必須大於等於decimal_places
.
DecimalField.decimal_places
: 小數點後的數字數量 - 示例:
money=models.DecimalField( max_digits=7, decimal_places=2, default=0.0 )
- 參數:
-
FloatField()
數據庫類型:double
編程語言中和數據庫中都使用小數表示值 -
EmailField()
- 數據庫類型:
varchar
- 編程語言和數據庫中使用字符串
- 數據庫類型:
-
IntegerField()
數據庫類型:int
編程語言和數據庫中使用整數 -
URLField()
數據庫類型:varchar(200)
編程語言和數據庫中使用字符串 -
ImageField()
數據庫類型:varchar(100)
作用:在數據庫中爲了保存圖片的路徑
編程語言和數據庫中使用字符串-
示例:
image=models.ImageField( upload_to="static/images" )
-
upload_to
:指定圖片的上傳路徑
在後臺上傳時會自動的將文件保存在指定的目錄下
-
-
TextField()
數據庫類型:longtext
作用:表示不定長的字符數據
參考文檔:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types
- 字段選項
FIELD_OPTIONS
字段選項, 指定創建的列的額外的信息
允許出現多個字段選項,多個選項之間使用,
隔開-
primary_key
如果設置爲True
,表示該列爲主鍵,如果指定一個字段爲主鍵,則此數庫表不會創建id
字段 -
blank
設置爲True
時,字段可以爲空。設置爲False
時,字段是必須填寫的。 -
null
如果設置爲True
,表示該列值允許爲空。
默認爲False
,如果此選項爲False
建議加入default
選項來設置默認值 -
default
設置所在列的默認值,如果字段選項null=False
建議添加此項 -
db_index
如果設置爲True
,表示爲該列增加索引 -
unique
如果設置爲True
,表示該字段在數據庫中的值必須是唯一(不能重複出現的) -
db_column
指定列的名稱,如果不指定的話則採用屬性名作爲列名 -
verbose_name
設置此字段在admin界面上的顯示名稱。 -
示例:
# 創建一個屬性,表示用戶名稱, #長度30個字符,必須是唯一的,不能爲空,添加索引 name = models.CharField(max_length=30, unique=True, null=False, db_index=True)
-
文檔參見:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-options
數據庫遷移
建立好模型類後,需要進行數據庫遷移纔可以生成數據庫表。
- 遷移步驟
- 生成遷移文件
$ python3 manager.py makemigrations
執行後會在應用目錄下的migrations
文件加下生成遷移文件 - 執行遷移文件
$ python3 manager.py migrate
執行後會按照模型類的定義在數據庫生成對應的表。
- 生成遷移文件
注意:
每次修改模型類,都需要執行上面兩步遷移步驟,才能使數據庫更新。
頻繁的修改模型類,在遷移時候會更容易出現遷移失敗的問題。
數據庫遷移的錯誤處理方法
當執行 $ python3 manage.py makemigrations
出現如下遷移錯誤時的處理方法
-
錯誤信息
$ python3 manage.py makemigrations You are trying to change the nullable field 'title' on book to non-nullable without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration) 3) Quit, and let me add a default in models.py Select an option:
-
翻譯爲中文如下:
$ python3 manage.py makemigrations 您試圖將圖書上的可空字段“title”更改爲非空字段(沒有默認值);我們不能這樣做(數據庫需要填充現有行)。 請選擇修復: 1)現在提供一次性默認值(將對所有現有行設置此列的空值) 2)暫時忽略,讓我自己處理空值的現有行(例如,因爲您在以前的數據遷移中添加了RunPython或RunSQL操作來處理空值) 3)退出,讓我在models.py中添加一個默認值 選擇一個選項:
-
錯誤原因
- 當將如下代碼
class Book(models.Model): title = models.CharField("書名", max_length=50, null=True)
- 去掉 null=True 改爲如下內容時會出現上述錯誤
class Book(models.Model): title = models.CharField("書名", max_length=50)
- 原理是 此數據庫的title 字段由原來的可以爲NULL改爲非NULL狀態,意味着原來這個字段可以不填值,現在改爲必須填定一個值,那填什麼值呢?此時必須添加一個缺省值。
-
處理方法:
- 選擇1 手動給出一個缺省值,在生成 bookstore/migrations/000x_auto_xxxxxxxx_xxxx.py 文件時自動將輸入的值添加到default參數中
- 暫時忽略,以後用其它的命令處理缺省值問題(不推薦)
- 退出當前生成遷移文件的過程,自己去修改models.py, 新增加一個
default=XXX
的缺省值(推薦使用)
-
數據庫的遷移文件混亂的解決辦法
- 刪除所有 migrations 裏所有的 000?_XXXX.py (
__init__.py
除外) - 刪除數據庫
sql> drop database mywebdb;
- 重新創建數據庫
sql> create datebase mywebdb default charset...;
- 重新生成遷移文件
python3 manage.py makemigrations
- 重新更新數據庫
python3 manage.py migrate
- 刪除所有 migrations 裏所有的 000?_XXXX.py (