django+mysql的使用

来源:https://www.cnblogs.com/wyl-0120/archive/2018/11/23/10005289.html
-Advertisement-
Play Games

Django中每一個模型model都對應於資料庫中的一張表,每個模型中的欄位都對應於資料庫表的列。方便的是,django可以自動生成這些create table, alter table, drop table的操作。其次Django為咱們也提供了後臺管理模塊(Django-Admin),主要功能是 ...


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 |   | 941807449  | 2018-11-08 09:58:40.226856 | 2018-11-08 09:58:40.227002 |
| 5554311867 | tom|  15 |   | 1598619027 | 2018-11-08 09:58:40.203807 | 2018-11-08 09:58:40.203960 |
| 7302510986 | tom4 |  15 |   | 9602601619 | 2018-11-08 09:58:40.251479 | 2018-11-08 09:58:40.251682 |
| 847849420  | tom3 |  15 |   | 195276039  | 2018-11-08 09:58:40.238601 | 2018-11-08 09:58:40.238928 |
| 9962892430 | tom1 |  15 |   | 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 |   | 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個技術方向,後臺回覆"禮包"即可領取。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 創建型設計模式是設計模式的入門基礎,主要包括工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式,以及簡單工廠模式,本文對他們進行了分析對比,總結了創建型模式之間的區別聯繫 ...
  • 一、概念 工廠方法模式:用來封裝對象的創建。工廠方法模式(Factory Method Pattern)通過讓 子類 決定該創建的對象是什麼,來達到將對象創建的過程封裝的目的。這樣,關於超類的代碼和子類創建對象的代碼之間就解耦了。 抽象工廠模式(Abstract Factory Pattern):提 ...
  • 直接使用 JDBC 的場景,如果代碼中存在拼接 SQL 語句,那麼很有可能會產生註入,如 安全的寫法是使用 參數化查詢 ( parameterized queries ),即 SQL 語句中使用參數綁定( ? 占位符 ) 和 PreparedStatement,如 使用PreparedStateme ...
  • 1.Map 遍歷: 2.map的長度: int size=Map.size(); ...
  • 前言 網際網路聯繫的是世界各地的電腦(通過電纜),萬維網聯繫的是網上的各種各樣資源(通過文本超鏈接),如靜態的HTML文件,動態的軟體程式······。由於萬維網的存在,處於網際網路中的每台電腦可以很方便地進行消息交流、文件資源交流······。基於網際網路的幫助,我們可以在web客戶端(如瀏覽器等) ...
  • FileManager 圖片管理插件是 TinyMCE下 免費且非官方的文件插件,可上傳/管理的類型包括:文件,圖片,視頻。 本教程主要展示大叔在為安裝開發插件過程中進行調整的修改記錄。 ...
  • 昨天是感恩節,上幼兒園的女兒在老師的叮囑下,晚上為我和老婆洗了腳(形式上的^_^),還給我們每人端了一杯水。看著孩子一天天的長大,懂事,感覺很開心。話說咱們程式員這麼辛苦是為了什麼?不就是為了老婆,孩子,熱炕頭,有一個溫暖幸福的家庭,再捎帶著用代碼改變一下世界嗎?想到這裡,頓時覺得學習,創作博客的勁... ...
  • 有人說,你應該關註時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫“無聊”的技術文了,因為程式員的圈子真的很小,即便是像鴻祥那樣的招牌大牛,文章是那麼的乾貨,瀏覽量有多少?不到萬吧;有人說,你別妄想在寫作上面知識變現了,因為你寫的文章真的很不優秀,我都不愛看! 我想說, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...