django+mysql如何使用
这篇文章将为大家详细讲解有关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
pip3installpymysql
项目中配置
在最开始的项目包下的__init__.py中进行如下配置
"""
setting中的配置默认为sqlite3数据库当需要修改成MySql时
并且在setting.py的同级目录的__init__.py加入如下配置
否则会报错:ErrorloadingMySQLdbmodule.
"""
importpymysql
pymysql.install_as_MySQLdb()
如果mysql配置信息错误(用户名、密码、host等)控制台会报如下异常
pymysql.err.OperationalError:(1045,"Accessdeniedforuser'ROOT'@'localhost'(usingpassword:YES)")
在app文件的models.py文件中 创建Student(学生信息)和StudentUnion(社团信息)
models.py:数据模块,用于数据库设计
"""
创建学生信息表模型
"""
fromdjango.dbimportmodels
"""
该类是用来生成数据库的必须要继承models.Model
"""
classStudent(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)
classMeta:
db_table='student'
"""
学生社团信息表
"""
classstudentUnion(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)
classMeta:
db_table='student_union'
"""
OneToOneField:一对一
ForeignKey:一对多
ManyToManyField:多对多(没有ondelete属性)
"""
在利用models.py文件生成数据库表之前,我们需要手动的先创建数据库:
mysql>createdatabasedjango_mysql;
QueryOK,1rowaffected(0.01sec)
创建完django_msql库之后,我们在终端执行如下命令,他的作用是将models文件生成一个迁移文件
python3manage.pymakemigrations
迁移文件生成完毕,执行
python3manage.pymigrate
会将迁移文件的内容作用到数据库中,生成表或者修改字段属性
控制台输出如下,则表示执行成功
(django_venv)xxxxxdeAir:djangoDemoxxxxx$python3manage.pymigrate
Operationstoperform:
Applyallmigrations:admin,app_demo,auth,contenttypes,sessions
Runningmigrations:
Applyingcontenttypes.0001_initial...OK
Applyingauth.0001_initial...OK
Applyingadmin.0001_initial...OK
Applyingadmin.0002_logentry_remove_auto_add...OK
Applyingadmin.0003_logentry_add_action_flag_choices...OK
Applyingapp_demo.0001_initial...OK
Applyingcontenttypes.0002_remove_content_type_name...OK
Applyingauth.0002_alter_permission_name_max_length...OK
Applyingauth.0003_alter_user_email_max_length...OK
Applyingauth.0004_alter_user_username_opts...OK
Applyingauth.0005_alter_user_last_login_null...OK
Applyingauth.0006_require_contenttypes_0002...OK
Applyingauth.0007_alter_validators_add_error_messages...OK
Applyingauth.0008_alter_user_username_max_length...OK
Applyingauth.0009_alter_user_last_name_max_length...OK
Applyingsessions.0001_initial...OK
查看我们的django_mysql数据库,其中student和student_union就是用models文件生成的表,其他的表是项目自动生成的,暂时可以先不用管
mysql>usedjango_mysql
Databasechanged
mysql>showtables;
+----------------------------+
|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|
+----------------------------+
12rowsinset(0.00sec)
表结构
desc查看表结构
mysql>descstudent;
+------------+-------------+------+-----+---------+-------+
|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||
+------------+-------------+------+-----+---------+-------+
7rowsinset(0.00sec)
mysql>descstudent_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||
+--------------+-------------+------+-----+---------+-------+
4rowsinset(0.00sec)
至此Django利用models文件创建数据库表的功能已经完毕。接下来用代码的方式演示一下Django如何进行增删改查
增加数据
为了提供一些测试数据,这里用for循环批量的加了几条简单的数据。
fromapp_demo.modelsimportStudent
importrandom
"""
插入测试数据
"""
definsert(request):
#随机整数作为学号
foriinrange(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()
returnHttpResponse('数据插入完毕')
urls.py 文件中 urlpatterns中配置
url(r'^insert/',views.insert)
浏览器中访问http://localhost:8000/insert/ 浏览器显示‘数据插入完毕’
查询数据库,发现有5天数据,也就是插入成功
mysql>select*fromstudent;
+------------+------+-----+-----+------------+----------------------------+----------------------------+
|studentNum|name|age|sex|mobile|createTime|modifyTime|
+------------+------+-----+-----+------------+----------------------------+----------------------------+
|1352687635|tom2|15|1|941807449|2018-11-0809:58:40.226856|2018-11-0809:58:40.227002|
|5554311867|tom0|15|0|1598619027|2018-11-0809:58:40.203807|2018-11-0809:58:40.203960|
|7302510986|tom4|15|0|9602601619|2018-11-0809:58:40.251479|2018-11-0809:58:40.251682|
|847849420|tom3|15|0|195276039|2018-11-0809:58:40.238601|2018-11-0809:58:40.238928|
|9962892430|tom1|15|0|3265013828|2018-11-0809:58:40.215488|2018-11-0809:58:40.216106|
+------------+------+-----+-----+------------+----------------------------+----------------------------+
5rowsinset(0.00sec)
查询数据
"""
查询
"""
deffind(request):
#sql='select*fromstudent'
#django也可以执行原生的sql语句
#result=Student.objects.raw(sql)
#查询name=tom1的数据
result=Student.objects.filter(name='tom1')
"""
result为<class'django.db.models.query.QuerySet'>的对象
需要进行数据处理
"""
arr=[]
foriinresult:
content={'学号':i.studentNum,'姓名':i.name,'性别':i.sex}
arr.append(content)
print(arr)
print(type(arr))
returnHttpResponse(arr)
配置urls,浏览器访问localhost:8000/find/
修改数据
"""
修改
"""
defmodify(request,studentNum):
#通过学号获取student对象
student=Student.objects.get(studentNum=studentNum)
#设置student的name为jack
student.name='jack'
student.save()
returnHttpResponse('修改成功.')
setting文件中的配置如下
url(r'^modify/(?P<studentNum>\d+)',views.modify),
修改学号847849420的name为jack
再次查询mysql数据库,发现name已经被更新成了jack
mysql>select*fromstudentwherestudentNum='847849420';
+------------+------+-----+-----+-----------+----------------------------+----------------------------+
|studentNum|name|age|sex|mobile|createTime|modifyTime|
+------------+------+-----+-----+-----------+----------------------------+----------------------------+
|847849420|jack|15|0|195276039|2018-11-0809:58:40.238601|2018-11-0810:22:46.403147|
+------------+------+-----+-----+-----------+----------------------------+----------------------------+
1rowinset(0.00sec)
删除数据
"""
删除
"""
defdelete(request,studentNum):
student=Student.objects.get(studentNum=studentNum)
student.delete()
returnHttpResponse('删除成功.')
settings.py中urlpatterns的配置如下
url(r'^delete/(?P<studentNum>.+)',views.delete)
.+ 表示匹配多个字符(不包括换行等字符)
浏览器请求该视图
查询数据库,发现该数据已经被删除
mysql>select*fromstudentwherestudentNum='847849420';
Emptyset(0.01sec
关于“django+mysql如何使用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。