Django框架學習(二):連接MySQL數據庫並對數據進行操作
Django規定,如果要使用數據庫模型,必須要創建一個app。
MySQL的安裝配置
window系統
前往MySQL官網https://dev.mysql.com/downloads/mysql/下載window版的MySQL Community Server 8.0.15的壓縮包,如下圖:
把壓縮包解壓到某一路徑,我解壓到D:\Program Files
,在剛剛解壓的文件夾D:\Program Files\mysql-8.0.15-winx64
內,新建一個data文件夾,並新建一個my.ini文件,裏面的內容如下:
[mysql]
# 設置mysql客戶端默認字符集
default-character-set=utf8
[mysqld]
# 設置3306端口
port = 3306
# 設置mysql的安裝目錄
basedir=D:\Program Files\mysql-8.0.15-winx64
# 設置 mysql數據庫的數據的存放目錄,即剛剛新建的data文件夾內
datadir=D:\Program Files\mysql-8.0.15-winx64\data
# 允許最大連接數
max_connections=20
# 服務端使用的字符集默認爲8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
以管理員身份運行終端,進入mysql目錄下的bin文件夾:
cd D:\Program Files\mysql-8.0.15-winx64\bin
運行一下命令初始化數據庫:
mysqld --initialize --console
執行完成後會產生root用戶默認密碼,這個密碼務必要記住,後面會用到:
...
2018-04-20T02:35:05.464644Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: APWCY5ws&hjQ
...
然後執行安裝命令:
mysqld install
然後便可以開啓mysql服務:
net start mysql
若開啓服務時出現系統錯誤2,則先卸載再重新安裝:
mysqld remove
mysqld install
開啓服務後,執行以下命令進入mysql的終端,密碼爲之前初始化數據庫時生成的默認密碼:
mysql -uroot -p
然後執行以下命令修改密碼永不過期,這樣可以避免密碼失效的問題:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
然後執行以下命令修改密碼模式,否則後面再Django中連接數據庫時會出現RuntimeError: cryptography is required for sha256_password or caching_sha2_password
錯誤:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
然後刷新權限:
FLUSH PRIVILEGES;
之前的默認密碼不好記,這裏我們改爲自己熟悉的密碼,這裏我直接改爲"123456":
alter user 'root'@'localhost' identified by '123456';
最後,我們要在mysql終端中創建一個database:
create database my_blog_db;
查看和刪除database的命令如下:
show databases;
drop database my_blog_db;
這樣,在後面的Django中,我們就可以連接名爲my_blog_db
的database了,
ubuntu系統
前往mysql官網下載https://dev.mysql.com/downloads/repo/apt/deb包,如下圖:
下載完成後,在deb包所在的文件夾下打開終端,執行以下命令:
sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb
然後直接選擇”OK“,如下圖:
然後執行更新語句:
sudo apt update
然後進行安裝:
sudo apt install mysql-server
接着便是在安裝界面中輸入root密碼,這個密碼務必要記住,後面會用到。
然後是閱讀配置MySQ社區服務器條例,按鍵盤上的”右“方向鍵,即可選擇”OK“按鈕,回車即可。
接下來是重要的密碼加密方式,我們選第二個,如下圖:
因爲新版mysql的密碼加密方式很多地方都暫時不支持,所以選第二個舊版的密碼加密方式。
安裝完成之後,便可以在終端中登錄進mysql,密碼是123456:
mysql –u root –p
然後創建一個database
create database my_blog_db
這樣,在後面的Django中,我們就可以連接名爲my_blog_db
的database了,
查看和刪除database的命令如下:
show databases;
drop database my_blog_db;
最後是mysql服務的開啓和關閉:
service mysql start
service mysql stop
如果提示系統權限限制,就先獲取 root 權限,再開啓 mysql 服務:
su root
Django連接MySQL
window系統
首先安裝PyMySQL:
pip3 install PyMySQL
然後安裝mysqlclient:
前往https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient,根據系統的python版本選擇對應的mysqlclient文件,如下圖:
下載到本地後,在終端中進入該文件所在的文件夾,執行以下命令即可:
pip3 install mysqlclient-1.4.2-cp37-cp37m-win32.whl
接着便是修改settings.py文件,如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
'NAME': 'my_blog_db', # 之前在mysql終端中創建的database
'USER': 'root', # 數據庫用戶名
'PASSWORD': '123456', # 數據庫密碼
'HOST': 'localhost', # 數據庫運行的主機
'PORT': '3306', # 數據庫服務開啓的端口
}
}
寫了models.py文件後(之後介紹如何寫models.py操作數據庫),執行以下命令:
python manage.py makemigrations
若出現django.db.utils.OperationalError: (2059, < NULL >)
錯誤,則在django項目的__init__.py文件中添加:
import pymysql
pymysql.install_as_MySQLdb()
若出現django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11
錯誤,則找到Python安裝路徑下的Python37-32\Lib\site-packages\django\db\backends\mysql\base.py
文件,將文件中的以下代碼註釋:
if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
若出現AttributeError: 'str' object has no attribute 'decode'
錯誤,則找到python安裝路徑下的Python37-32\Lib\site-packages\django\db\backends\mysql\operations.py
,在第146行改動以下代碼,即把decode改爲encode:
(line146):query = query.encode(errors='replace')
最後執行:
python manage.py migrate
成功之後,便可以在view.py中進行數據庫的增刪改查各種操作
ubuntu系統
ubuntu系統自帶了python2和python3,所以寫命令時,務必把python命令寫成python3,pip命令也寫成pip3。
首先安裝PyMySQL:
pip3 install PyMySQL
然安裝libmysqld-dev:
sudo apt-get install libmysqld-dev
有可能會出現以下錯誤:
這是我們要先安裝對應版本的libmysqlclient-dev:
sudo apt-get install libmysqlclient-dev=5.7.25-0ubuntu0.16.04.2
然後再重新安裝libmysqld-dev。
最後安裝mysqlclient:
sudo pip3 install mysqlclient
接着便是修改settings.py文件,如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
'NAME': 'my_blog_db', # 之前在mysql終端中創建的database
'USER': 'root', # 數據庫用戶名
'PASSWORD': '123456', # 數據庫密碼
'HOST': 'localhost', # 數據庫運行的主機
'PORT': '3306', # 數據庫服務開啓的端口
}
}
寫了models.py文件後(之後介紹如何寫models.py操作數據庫),執行以下命令:
python3 manage.py makemigrations
若出現錯誤,參考前面window系統下的錯誤處理方法。
最後執行:
python3 manage.py migrate
成功之後,便可以在view.py中進行數據庫的增刪改查各種操作。
數據庫的使用
定義模型
Django 規定,如果要使用模型,必須要創建一個app。我們使用以下命令創建一個 TestModel 的 app:
django-admin startapp TestModel
並且記得把 app 名稱添加到 setting 文件裏面。
然後我們修改 TestModel/models.py 文件,代碼如下:
# models.py
from django.db import models
#用戶
class User(models.Model):
user_id = models.AutoField(primary_key=True)
user_phone = models.CharField(max_length=11)
user_password = models.CharField(max_length=20)
user_icon = models.BinaryField(default=None, null=True)
user_balance = models.IntegerField(default=100)
user_fillln = models.SmallIntegerField(default=0)
# 學生
class Student(models.Model):
......
模型字段的定義可以增加一些修飾符,如:
- 聲明主鍵 primary_key=True
- 默認值爲空 default=None, null=True
- 字符串長度限制 max_length=11
- 自動添加當前時間 auto_now_add=True
- …
然後再命令行中執行:
python manage.py makemigrations # 讓 Django 知道我們在我們的模型有一些變更
python manage.py migrate # 創建表結構
操作數據庫
我們通過匹配 url,分配給 view 中的函數,使用 view 中的函數進行數據庫操作和靜態文件返回等等。
添加數據
添加數據需要先創建對象,然後再執行 save 函數,相當於SQL中的INSERT:
new_user = models.User(
user_phone='15432458777',
user_password='123456'
)
new_user.save()
默認字段可以指明,也可以省略。
獲取數據
Django提供了多種方式來獲取數據庫的內容,如下代碼所示:
# 獲取多個對象用filter,並可按 id 從小到大排序
filter_users = models.User.objects.filter(user_phone='15487587777').order_by("id")
# 獲取單個對象用get
get_user = models.User.objects.get(user_id=1)
# 獲取全部對象用all
all = models.User.objects.all()
# 注意,獲取到的對象後,還有提取出裏面的值
user_id = get_student.user_id
student_number = get_student.student_number
student_name = get_student.student_name
# 如果獲取到的是多個對象,要利用循環獲取值
list = []
for filter_user in filter_users:
list.append({
'user_id': filter_user.user_id,
...
})
更新數據
# 修改其中一個id=1的name字段,再save,相當於SQL中的UPDATE
user1 = model.User.objects.get(id=1)
user1.name = 'Google'
user1.save()
# 另外一種方式
model.User.objects.filter(id=1).update(name='Google')
# 修改所有的列
model.User.objects.all().update(name='Google')
刪除數據
# 刪除id=1的數據
user1= model.User.objects.get(id=1)
user1.delete()
# 另外一種方式
model.User.objects.filter(id=1).delete()
# 刪除所有數據
model.User.objects.all().delete()