如何在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

如何在django中使用mysql

迁移文件生成完毕,执行

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/

如何在django中使用mysql

修改数据

"""
修改
"""
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

如何在django中使用mysql

再次查询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)

.+ 表示匹配多个字符(不包括换行等字符)

浏览器请求该视图

如何在django中使用mysql

查询数据库,发现该数据已经被删除

mysql>select*fromstudentwherestudentNum='847849420';
Emptyset(0.01sec)

上述就是小编为大家分享的如何在django中使用mysql了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-03-26 01:50:32
收藏
分享
海报
0 条评论
170
上一篇:怎么在Android中使用ViewPager实现一个滚动广告效果 下一篇:如何在vue中全局使用axios
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码