天天看點

【Django青銅修煉手冊】django+mysql的使用

Django中每一個模型model都對應于資料庫中的一張表,每個模型中的字段都對應于資料庫表的列。友善的是,django可以自動生成這些create table, alter table, drop table的操作。其次Django為咱們也提供了背景管理子產品(Django-Admin),主要功能是通過背景管理來實作用戶端的功能,可以對資料進行增删改查。也可以通過該功能進行二次開發

上期回顧 :

[Django青銅修煉手冊] 初識Django

Django中的mysql配置

在上期内容,我們了解了settings.py配置資訊的内容,其中DATABASES是用來管理資料庫配置的,預設是sqlite3資料庫,是以我們需要将其修改成mysql資料庫。

# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

# 資料庫配置 預設的資料庫為sqlite
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 資料庫引擎
'NAME': 'django_mysql', # 資料庫名
'USER': 'root', # 賬号
'PASSWORD': 'root', # 密碼
'HOST': '127.0.0.1', # HOST
'POST': 3306, # 端口


}

}
           

字段名稱代碼中都添加了相應說明,ENGINE為MYSQL資料庫引擎,這個當然不會憑空出現,需要我們去安裝

安裝pymysql

pip3 install pymysql           

項目中配置

在最開始的項目包下的__init__.py中進行如下配置

"""

setting中的配置預設為sqlite3資料庫 當需要修改成MySql時

并且在setting.py的同級目錄的__init__.py 加入如下配置

否則會報錯: Error loading MySQLdb module.

"""
import pymysql

pymysql.install_as_MySQLdb()
           

如果mysql配置資訊錯誤(使用者名、密碼、host等)控制台會報如下異常

pymysql.err.OperationalError: (1045, "Access denied for user 'ROOT'@'localhost' (using password: YES)")
           

在app檔案的models.py檔案中 建立Student(學生資訊)和StudentUnion(社團資訊)

models.py:資料子產品,用于資料庫設計

"""

建立學生資訊表模型

"""
from django.db import models

"""

該類是用來生成資料庫的 必須要繼承models.Model

"""
class Student(models.Model):
"""

建立如下幾個表的字段

"""
# 學号 primary_key=True: 該字段為主鍵

studentNum = models.CharField('學号', primary_key=True, max_length=15)
# 姓名 字元串 最大長度20

name = models.CharField('姓名', max_length=20)
# 年齡 整數 null=False, 表示該字段不能為空

age = models.IntegerField('年齡', null=False)
# 性别 布爾類型 預設True: 男生 False:女生

sex = models.BooleanField('性别', default=True)
# 手機 unique=True 該字段唯一

mobile = models.CharField('手機', unique=True, max_length=15)
# 建立時間 auto_now_add:隻有在新增的時候才會生效

createTime = models.DateTimeField(auto_now_add=True)
# 修改時間 auto_now: 添加和修改都會改變時間

modifyTime = models.DateTimeField(auto_now=True)

# 指定表名 不指定預設APP名字——類名(app_demo_Student)
class Meta:

db_table = 'student'


"""

學生社團資訊表

"""
class studentUnion(models.Model):
# 自增主鍵, 這裡不能設定default屬性,負責執行save的時候就不會新增而是修改元素

id = models.IntegerField(primary_key=True)
# 社團名稱

unionName = models.CharField('社團名稱', max_length=20)
# 社團人數

unionNum = models.IntegerField('人數', default=0)
# 社團負責人 關聯Student的主鍵 即studentNum學号 一對一的關系,on__delete 屬性在django2.0之後為必填屬性後面會介紹

unionRoot = models.OneToOneField(Student, on_delete=None)

class Meta:

db_table = 'student_union'


"""

OneToOneField: 一對一

ForeignKey: 一對多

ManyToManyField: 多對多(沒有ondelete 屬性)

"""
           

在利用models.py檔案生成資料庫表之前,我們需要手動的先建立資料庫:

mysql> create database django_mysql;

Query OK, 1 row affected (0.01 sec)           

建立完django_msql庫之後,我們在終端執行如下指令,他的作用是将models檔案生成一個遷移檔案

python3 manage.py makemigrations           
【Django青銅修煉手冊】django+mysql的使用

遷移檔案生成完畢,執行

python3 manage.py migrate
           

會将遷移檔案的内容作用到資料庫中,生成表或者修改字段屬性

控制台輸出如下,則表示執行成功

(django_venv) xxxxxdeAir:djangoDemo xxxxx$ python3 manage.py migrate

Operations to perform:

Apply all migrations: admin, app_demo, auth, contenttypes, sessions

Running migrations:

Applying contenttypes.0001_initial... OK

Applying auth.0001_initial... OK

Applying admin.0001_initial... OK

Applying admin.0002_logentry_remove_auto_add... OK

Applying admin.0003_logentry_add_action_flag_choices... OK

Applying app_demo.0001_initial... OK

Applying contenttypes.0002_remove_content_type_name... OK

Applying auth.0002_alter_permission_name_max_length... OK

Applying auth.0003_alter_user_email_max_length... OK

Applying auth.0004_alter_user_username_opts... OK

Applying auth.0005_alter_user_last_login_null... OK

Applying auth.0006_require_contenttypes_0002... OK

Applying auth.0007_alter_validators_add_error_messages... OK

Applying auth.0008_alter_user_username_max_length... OK

Applying auth.0009_alter_user_last_name_max_length... OK

Applying sessions.0001_initial... OK
           

檢視我們的django_mysql資料庫,其中student和student_union就是用models檔案生成的表,其他的表是項目自動生成的,暫時可以先不用管

mysql> use django_mysql

Database changed


mysql> show tables;

+----------------------------+
| Tables_in_django_mysql |

+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| student |
| student_union |

+----------------------------+
12 rows in set (0.00 sec)
           

表結構

desc檢視表結構

mysql> desc student;

+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |

+------------+-------------+------+-----+---------+-------+

| studentNum | varchar(15) | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |

| age | int(11) | NO | | NULL | |
| sex | tinyint(1) | NO | | NULL | |

| mobile | varchar(15) | NO | UNI | NULL | |
| createTime | datetime(6) | NO | | NULL | |

| modifyTime | datetime(6) | NO | | NULL | |

+------------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
           
mysql> desc student_union;

+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |

+--------------+-------------+------+-----+---------+-------+

| id | int(11) | NO | PRI | NULL | |
| unionName | varchar(20) | NO | | NULL | |

| unionNum | int(11) | NO | | NULL | |
| unionRoot_id | varchar(15) | NO | UNI | NULL | |

+--------------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)
           

至此Django利用models檔案建立資料庫表的功能已經完畢。接下來用代碼的方式示範一下Django如何進行增删改查

增加資料

為了提供一些測試資料,這裡用for循環批量的加了幾條簡單的資料。

from app_demo.models import Student
import random
"""

插入測試資料

"""
def insert(request):
# 随機整數 作為學号
for i in range(0, 5):

studentNum = int(random.uniform(0, 1) * 10000000000)
# 從models檔案中擷取student對象

student = Student()
# 給對象指派

student.studentNum = studentNum

student.name = 'tom' + str(i)

student.age = 15

student.sex = random.choice([True, False])

student.mobile = int(random.uniform(0, 1) * 10000000000)
# 插入資料

student.save()

return HttpResponse('資料插入完畢')
           

urls.py 檔案中 urlpatterns中配置

url(r'^insert/', views.insert)
           

浏覽器中通路http://localhost:8000/insert/ 浏覽器顯示‘資料插入完畢’

查詢資料庫,發現有5天資料,也就是插入成功

mysql> select * from student;

+------------+------+-----+-----+------------+----------------------------+----------------------------+
| studentNum | name | age | sex | mobile | createTime | modifyTime |

+------------+------+-----+-----+------------+----------------------------+----------------------------+
| 1352687635 | tom2 | 15 | 1 | 941807449 | 2018-11-08 09:58:40.226856 | 2018-11-08 09:58:40.227002 |
| 5554311867 | tom0 | 15 | 0 | 1598619027 | 2018-11-08 09:58:40.203807 | 2018-11-08 09:58:40.203960 |
| 7302510986 | tom4 | 15 | 0 | 9602601619 | 2018-11-08 09:58:40.251479 | 2018-11-08 09:58:40.251682 |
| 847849420 | tom3 | 15 | 0 | 195276039 | 2018-11-08 09:58:40.238601 | 2018-11-08 09:58:40.238928 |
| 9962892430 | tom1 | 15 | 0 | 3265013828 | 2018-11-08 09:58:40.215488 | 2018-11-08 09:58:40.216106 |

+------------+------+-----+-----+------------+----------------------------+----------------------------+
5 rows in set (0.00 sec)
           

查詢資料

"""

查詢

"""
def find(request):
#sql = 'select * from student'
# django 也可以執行原生的sql語句
#result = Student.objects.raw(sql)

# 查詢name = tom1的資料

result = Student.objects.filter(name='tom1')
"""

result為<class 'django.db.models.query.QuerySet'>的對象

需要進行資料處理

"""

arr = []
for i in result:

content = {'學号': i.studentNum, '姓名': i.name, '性别': i.sex}

arr.append(content)

print(arr)

print(type(arr))
return HttpResponse(arr)
           

配置urls,浏覽器通路localhost:8000/find/

【Django青銅修煉手冊】django+mysql的使用

修改資料

"""

修改

"""
def modify(request, studentNum):
# 通過學号擷取student對象

student = Student.objects.get(studentNum=studentNum)
# 設定student的name為jack

student.name = 'jack'

student.save()
return HttpResponse('修改成功.')
           

setting檔案中的配置如下

url(r'^modify/(?P<studentNum>\d+)', views.modify),
           

修改學号847849420的name為jack

【Django青銅修煉手冊】django+mysql的使用

再次查詢mysql資料庫,發現name已經被更新成了jack

mysql> select * from student where studentNum='847849420';

+------------+------+-----+-----+-----------+----------------------------+----------------------------+
| studentNum | name | age | sex | mobile | createTime | modifyTime |

+------------+------+-----+-----+-----------+----------------------------+----------------------------+
| 847849420 | jack | 15 | 0 | 195276039 | 2018-11-08 09:58:40.238601 | 2018-11-08 10:22:46.403147 |

+------------+------+-----+-----+-----------+----------------------------+----------------------------+
1 row in set (0.00 sec)
           

删除資料

"""

删除

"""
def delete(request, studentNum):

student = Student.objects.get(studentNum=studentNum)

student.delete()
return HttpResponse('删除成功.')
           

settings.py中urlpatterns的配置如下

url(r'^delete/(?P<studentNum>.+)', views.delete)
           

.+ 表示比對多個字元(不包括換行等字元)

浏覽器請求該視圖

【Django青銅修煉手冊】django+mysql的使用

查詢資料庫,發現該資料已經被删除

mysql> select * from student where studentNum='847849420';

Empty set (0.01 sec)           

原文釋出時間為: 2018-11-15 本文作者: 程式員共成長 本文來自雲栖社群合作夥伴“

程式員共成長

”,了解相關資訊可以關注“

程式員共成長

”。