如何在django中使用mysql
这期内容当中小编将会给大家带来有关如何在django中使用mysql,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
Django中的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, "Access denied for user 'ROOT'@'localhost' (using password: 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:djangoDemo xxxxx$ python3 manage.py migrateOperations to perform:Apply all migrations: admin, app_demo, auth, contenttypes, sessionsRunning migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying app_demo.0001_initial... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying sessions.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),
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了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
浅析Django接口版本控制
-
Django+Celery实现定时任务的示例
-
Python(django中如何使用restful框架)
-
Django实现drf搜索过滤和排序过滤
-
Django中怎么将ValuesQuerySet转换成json
今天就跟大家聊聊有关Django中怎么将ValuesQuerySet转换成json,可能很多人都不太了解,为了让大家更加了解,小编...
-
Django分页器的使用方法
这篇文章主要介绍了Django分页器的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面...
-
Python Django搭建文件下载服务器的实现shili
-
在Django中如何使用MQTT的方法
这篇文章主要介绍了在Django中如何使用MQTT的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有...
-
Django开发RESTful API怎么实现增删改查
-
Django如何显示可视化图表的实践