国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

django+mysql的使用示例

2020-01-04 14:00:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

Django中的mysql配置

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

# Database# https://docs.djangoproject.com/en/2.0/ref/settings/#databases# 數(shù)據(jù)庫(kù)配置 默認(rèn)的數(shù)據(jù)庫(kù)為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ù)庫(kù)引擎  'NAME': 'django_mysql', # 數(shù)據(jù)庫(kù)名  'USER': 'root', # 賬號(hào)  'PASSWORD': 'root', # 密碼  'HOST': '127.0.0.1', # HOST  'POST': 3306, # 端口 }}

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

安裝pymysql

pip3 install pymysql

項(xiàng)目中配置

在最開(kāi)始的項(xiàng)目包下的 init .py中進(jìn)行如下配置

"""setting中的配置默認(rèn)為sqlite3數(shù)據(jù)庫(kù) 當(dāng)需要修改成MySql時(shí)并且在setting.py的同級(jí)目錄的__init__.py 加入如下配置否則會(huì)報(bào)錯(cuò): Error loading MySQLdb module."""import pymysqlpymysql.install_as_MySQLdb()

如果mysql配置信息錯(cuò)誤(用戶名、密碼、host等)控制臺(tái)會(huì)報(bào)如下異常

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

在app文件的models.py文件中 創(chuàng)建Student(學(xué)生信息)和StudentUnion(社團(tuán)信息)

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

"""創(chuàng)建學(xué)生信息表模型"""from django.db import models""" 該類是用來(lái)生成數(shù)據(jù)庫(kù)的 必須要繼承models.Model"""class Student(models.Model): """ 創(chuàng)建如下幾個(gè)表的字段 """ # 學(xué)號(hào) primary_key=True: 該字段為主鍵 studentNum = models.CharField('學(xué)號(hào)', primary_key=True, max_length=15) # 姓名 字符串 最大長(zhǎng)度20 name = models.CharField('姓名', max_length=20) # 年齡 整數(shù) null=False, 表示該字段不能為空 age = models.IntegerField('年齡', null=False) # 性別 布爾類型 默認(rèn)True: 男生 False:女生 sex = models.BooleanField('性別', default=True) # 手機(jī) unique=True 該字段唯一 mobile = models.CharField('手機(jī)', unique=True, max_length=15) # 創(chuàng)建時(shí)間 auto_now_add:只有在新增的時(shí)候才會(huì)生效 createTime = models.DateTimeField(auto_now_add=True) # 修改時(shí)間 auto_now: 添加和修改都會(huì)改變時(shí)間 modifyTime = models.DateTimeField(auto_now=True) # 指定表名 不指定默認(rèn)APP名字——類名(app_demo_Student) class Meta:  db_table = 'student'"""學(xué)生社團(tuán)信息表"""class studentUnion(models.Model): # 自增主鍵, 這里不能設(shè)置default屬性,負(fù)責(zé)執(zhí)行save的時(shí)候就不會(huì)新增而是修改元素 id = models.IntegerField(primary_key=True) # 社團(tuán)名稱 unionName = models.CharField('社團(tuán)名稱', max_length=20) # 社團(tuán)人數(shù) unionNum = models.IntegerField('人數(shù)', default=0) # 社團(tuán)負(fù)責(zé)人 關(guān)聯(lián)Student的主鍵 即studentNum學(xué)號(hào) 一對(duì)一的關(guān)系,on__delete 屬性在django2.0之后為必填屬性后面會(huì)介紹 unionRoot = models.OneToOneField(Student, on_delete=None) class Meta:  db_table = 'student_union'"""OneToOneField: 一對(duì)一ForeignKey: 一對(duì)多ManyToManyField: 多對(duì)多(沒(méi)有ondelete 屬性)"""

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

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

創(chuàng)建完django_msql庫(kù)之后,我們?cè)诮K端執(zhí)行如下命令,他的作用是將models文件生成一個(gè)遷移文件

python3 manage.py makemigrations

django,mysql

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

python3 manage.py migrate

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

控制臺(tái)輸出如下,則表示執(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ù)庫(kù),其中student和student_union就是用models文件生成的表,其他的表是項(xiàng)目自動(dòng)生成的,暫時(shí)可以先不用管

mysql> use django_mysqlDatabase changedmysql> 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ù)庫(kù)表的功能已經(jīng)完畢。接下來(lái)用代碼的方式演示一下Django如何進(jìn)行增刪改查

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

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

from app_demo.models import Studentimport random"""插入測(cè)試數(shù)據(jù)"""def insert(request): # 隨機(jī)整數(shù) 作為學(xué)號(hào) for i in range(0, 5):  studentNum = int(random.uniform(0, 1) * 10000000000)  # 從models文件中獲取student對(duì)象  student = Student()  # 給對(duì)象賦值  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)

瀏覽器中訪問(wèn)http://localhost:8000/insert/ 瀏覽器顯示‘數(shù)據(jù)插入完畢'

查詢數(shù)據(jù)庫(kù),發(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語(yǔ)句 #result = Student.objects.raw(sql) # 查詢name = tom1的數(shù)據(jù) result = Student.objects.filter(name='tom1') """ result為<class 'django.db.models.query.QuerySet'>的對(duì)象 需要進(jìn)行數(shù)據(jù)處理 """ arr = [] for i in result:  content = {'學(xué)號(hào)': i.studentNum, '姓名': i.name, '性別': i.sex}  arr.append(content) print(arr) print(type(arr)) return HttpResponse(arr)

配置urls,瀏覽器訪問(wèn)localhost:8000/find/

django,mysql

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

"""修改"""def modify(request, studentNum): # 通過(guò)學(xué)號(hào)獲取student對(duì)象 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),

setting文件中的配置如下

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

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

django,mysql

再次查詢mysql數(shù)據(jù)庫(kù),發(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)

.+ 表示匹配多個(gè)字符(不包括換行等字符)

瀏覽器請(qǐng)求該視圖

django,mysql

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜黄县| 沙湾县| 邵阳县| 吉安县| 建水县| 紫阳县| 山东省| 茌平县| 杭锦后旗| 隆化县| 贵德县| 金寨县| 奇台县| 桦甸市| 普安县| 福海县| 清苑县| 沈阳市| 神农架林区| 芷江| 泽州县| 于田县| 绵竹市| 丹巴县| 永仁县| 磴口县| 新化县| 扬中市| 三门县| 锦屏县| 九寨沟县| 荥阳市| 乌拉特后旗| 松阳县| 博乐市| 山东省| 舞阳县| 云南省| 阳春市| 长兴县| 阳信县|