溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

django+mysql如何使用

發(fā)布時間:2021-11-03 09:34:21 來源:億速云 閱讀:144 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)django+mysql如何使用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Django中每一個模型model都對應(yīng)于數(shù)據(jù)庫中的一張表,每個模型中的字段都對應(yīng)于數(shù)據(jù)庫表的列。方便的是,django可以自動生成這些create table, alter table, drop table的操作。其次Django為咱們也提供了后臺管理模塊(Django-Admin),主要功能是通過后臺管理來實現(xiàn)客戶端的功能,可以對數(shù)據(jù)進行增刪改查。也可以通過該功能進行二次開發(fā)

Django中的mysql配置 

    在上期內(nèi)容,我們了解了settings.py配置信息的內(nèi)容,其中DATABASES是用來管理數(shù)據(jù)庫配置的,默認(rèn)是sqlite3數(shù)據(jù)庫,所以我們需要將其修改成mysql數(shù)據(jù)庫。

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

# 數(shù)據(jù)庫配置 默認(rèn)的數(shù)據(jù)庫為sqlite
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 數(shù)據(jù)庫引擎
        'NAME': 'django_mysql', # 數(shù)據(jù)庫名
        'USER': 'root', # 賬號
        'PASSWORD': 'root', # 密碼
        'HOST': '127.0.0.1', # HOST
        'POST': 3306, # 端口

    }
}

字段名稱代碼中都添加了相應(yīng)說明,ENGINE為MYSQL數(shù)據(jù)庫引擎,這個當(dāng)然不會憑空出現(xiàn),需要我們?nèi)グ惭b

安裝pymysql

pip3 install pymysql

項目中配置

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

"""
setting中的配置默認(rèn)為sqlite3數(shù)據(jù)庫 當(dāng)需要修改成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文件中 創(chuàng)建Student(學(xué)生信息)和StudentUnion(社團信息)

models.py:數(shù)據(jù)模塊,用于數(shù)據(jù)庫設(shè)計

"""
創(chuàng)建學(xué)生信息表模型
"""
from django.db import models

"""
 該類是用來生成數(shù)據(jù)庫的 必須要繼承models.Model
"""
class Student(models.Model):
    """
    創(chuàng)建如下幾個表的字段
    """
    # 學(xué)號 primary_key=True: 該字段為主鍵
    studentNum = models.CharField('學(xué)號', primary_key=True, max_length=15)
    # 姓名 字符串 最大長度20
    name = models.CharField('姓名', max_length=20)
    # 年齡 整數(shù) null=False, 表示該字段不能為空
    age = models.IntegerField('年齡', null=False)
    # 性別 布爾類型 默認(rèn)True: 男生 False:女生
    sex = models.BooleanField('性別', default=True)
    # 手機 unique=True 該字段唯一
    mobile = models.CharField('手機', unique=True, max_length=15)
    # 創(chuàng)建時間 auto_now_add:只有在新增的時候才會生效
    createTime = models.DateTimeField(auto_now_add=True)
    # 修改時間 auto_now: 添加和修改都會改變時間
    modifyTime = models.DateTimeField(auto_now=True)

    # 指定表名 不指定默認(rèn)APP名字——類名(app_demo_Student)
    class Meta:
        db_table = 'student'


"""
學(xué)生社團信息表
"""
class studentUnion(models.Model):
    # 自增主鍵, 這里不能設(shè)置default屬性,負(fù)責(zé)執(zhí)行save的時候就不會新增而是修改元素
    id = models.IntegerField(primary_key=True)
    # 社團名稱
    unionName = models.CharField('社團名稱', max_length=20)
    # 社團人數(shù)
    unionNum = models.IntegerField('人數(shù)', default=0)
    # 社團負(fù)責(zé)人 關(guān)聯(lián)Student的主鍵 即studentNum學(xué)號 一對一的關(guān)系,on__delete 屬性在django2.0之后為必填屬性后面會介紹
    unionRoot = models.OneToOneField(Student, on_delete=None)

    class Meta:
        db_table = 'student_union'


"""
OneToOneField: 一對一
ForeignKey: 一對多
ManyToManyField: 多對多(沒有ondelete 屬性)
"""

在利用models.py文件生成數(shù)據(jù)庫表之前,我們需要手動的先創(chuàng)建數(shù)據(jù)庫:

mysql> create database django_mysql;
Query OK, 1 row affected (0.01 sec)

創(chuàng)建完django_msql庫之后,我們在終端執(zhí)行如下命令,他的作用是將models文件生成一個遷移文件

 python3 manage.py makemigrations

django+mysql如何使用

遷移文件生成完畢,執(zhí)行

python3 manage.py migrate

會將遷移文件的內(nèi)容作用到數(shù)據(jù)庫中,生成表或者修改字段屬性

控制臺輸出如下,則表示執(zhí)行成功

(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數(shù)據(jù)庫,其中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)

表結(jié)構(gòu)

desc查看表結(jié)構(gòu)

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文件創(chuàng)建數(shù)據(jù)庫表的功能已經(jīng)完畢。接下來用代碼的方式演示一下Django如何進行增刪改查

增加數(shù)據(jù)

為了提供一些測試數(shù)據(jù),這里用for循環(huán)批量的加了幾條簡單的數(shù)據(jù)。

from app_demo.models import Student
import random
"""
插入測試數(shù)據(jù)
"""
def insert(request):
    # 隨機整數(shù) 作為學(xué)號
    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)
        # 插入數(shù)據(jù)
        student.save()

    return HttpResponse('數(shù)據(jù)插入完畢')

urls.py 文件中 urlpatterns中配置

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

瀏覽器中訪問http://localhost:8000/insert/ 瀏覽器顯示‘?dāng)?shù)據(jù)插入完畢’

查詢數(shù)據(jù)庫,發(fā)現(xiàn)有5天數(shù)據(jù),也就是插入成功

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)

查詢數(shù)據(jù)

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

    # 查詢name = tom1的數(shù)據(jù)
    result = Student.objects.filter(name='tom1')
    """
    result為<class 'django.db.models.query.QuerySet'>的對象
    需要進行數(shù)據(jù)處理
    """
    arr = []
    for i in result:
        content = {'學(xué)號': i.studentNum, '姓名': i.name, '性別': i.sex}
        arr.append(content)
    print(arr)
    print(type(arr))
    return HttpResponse(arr)

配置urls,瀏覽器訪問localhost:8000/find/ 

django+mysql如何使用

修改數(shù)據(jù)

"""
修改
"""
def modify(request, studentNum):
    # 通過學(xué)號獲取student對象
    student = Student.objects.get(studentNum=studentNum)
    # 設(shè)置student的name為jack
    student.name = 'jack'
    student.save()
    return HttpResponse('修改成功.')

setting文件中的配置如下

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

修改學(xué)號847849420的name為jack

django+mysql如何使用

再次查詢mysql數(shù)據(jù)庫,發(fā)現(xiàn)name已經(jīng)被更新成了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)

刪除數(shù)據(jù)

"""
刪除
"""
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+mysql如何使用

查詢數(shù)據(jù)庫,發(fā)現(xiàn)該數(shù)據(jù)已經(jīng)被刪除

mysql> select * from student where studentNum='847849420';
Empty set (0.01 sec

關(guān)于“django+mysql如何使用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI