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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章