django+mysql的使用
Django中每一個模型model都對應於資料庫中的一張表,每個模型中的欄位都對應於資料庫表的列。方便的是,django可以自動生成這些create table, alter table, drop table的操作。其次Django為咱們也提供了後臺管理模組(Django-Admin),主要功能是通過後臺管理來實現客戶端的功能,可以對資料進行增刪改查。也可以通過該功能進行二次開發
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

在這裡插入圖片描述
遷移檔案生成完畢,執行
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/
在這裡插入圖片描述
修改資料
""" 修改 """ 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

在這裡插入圖片描述
再次查詢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)
.+ 表示匹配多個字元(不包括換行等字元)
瀏覽器請求該檢視

在這裡插入圖片描述
查詢資料庫,發現該資料已經被刪除
mysql> select * from student where studentNum='847849420'; Empty set (0.01 sec)
關注公眾號「程式員共成長」(id: finishbug)。給新加入的小夥伴準備了豐厚的見面禮,包括但不限於:Python、Java、Linux、大資料、人工智慧、前端等21個技術方向,後臺回覆"禮包"即可領取。