您现在的位置是:网站首页> 编程资料编程资料
django中操作mysql数据库的方法_python_
2023-05-26
488人已围观
简介 django中操作mysql数据库的方法_python_
1.准备工作(django连接数据库)
1.本机电脑下载好mysql数据库
2.打开django,修改setting.py中的DATABASES配置项
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'python', 'USER': 'root', 'PASSWORD': 'zy199909237412', 'HOST': '127.0.0.1', 'POST': '3306', } }3.在pycharm的右侧栏点击database或者做下角点击database,连接数据库,如果都没有,则去pluging里面寻找是否装了database插件!!

或者

4.输入需要连接的数据库

5.这里没有下载驱动的需要先下载,不然连接不上

6.在django项目中的__init__.py中导入pymysql,告诉django使用pymysql连接数据库,而不是mysqldb模块
import pymysql pymysql.install_as_MySQLdb()
7.简单使用pycharm操作数据库

2.django操作数据库(ORM)
2.1 ORM简介
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM在业务逻辑层和数据库层之间充当了桥梁的作用
简单来说,ORM就是使用面向对象的方式来操作数据库!
(1)ORM的优势:
1.将表和类一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
2.ORM提供了对数据库的映射,不用直接编写SQL代码,只需操作对象就能对数据库操作数据,提高了工作效率
(2)ORM的劣势
1.一些查询操作完成不了
2.一定程度上牺牲了程序的执行效率
3.用久了会忘SQL语言
2.2 创建表和字段
from django.db import models # 1.导入models模块 # 2.定义一个类继承models.Model类(创建一张项目名(应用名)_类名的表) class Book(models.Model): # 3.定义类属性title和price(对应是创建字段名、字段类型和字段选项) title = models.CharField('书名', max_length=50, default='') price = models.DecimalField('价格', max_digits=7, decimal_places=2) class 模型类名(models.Model): 字段名 = models.字段类型(字段选项) 在类里面不指定主键字段,django会帮您自动创建一个id主键!注意:对于数据库的增删改查之后都要进行数据库迁移
1.执行python3 manage.py makemigration---将应用下的model.py文件生成一个中间件文件,并保存在migrations文件中
2.执行python3 manage.py migrate ----将每个应用下的migrations目录中的中间文件同步回数据库
2.3 字段的增删改查
1.增加字段
直接在对应的类里面添加字段、字段类型和字段选项 注意增加的字段都需要指定default = '' 或者null = True,如下添加info字段: info = models.CharField(max_length=32,default='',null=True)
2.修改字段
直接在类里面修改对应字段就行!
然后执行数据库迁移命令!
3.字段的删除
直接在类里面将需要删的字段注释掉就行!
然后执行数据库迁移命令!注意:执行完毕了,数据库对应的数据就没有了!慎重!!!
2.4 单表数据的增删改查
每个继承model.Model的模型类,都有一个objects对象被同样继承下来,这个对象叫管理器对象,数据库的增删改查都是通过模型的管理器实现。
对于数据的增删改查,其实最主要的都是在views.py的视图函数里完成的!因此,我们需要在视图函数里进行数据库的增删改查操作!
2.4.1单表数据的查询
1.filter()查询方法
from app01 import models # 1.导入自己创建的模型类 # 2.filter查询方法,语法是:models.类名.objects.filter(),filter内可以查询多个参数,默认是and连接,等于SQL语法的where方法!,不传参时代表查所有 res = models.MyModle.objects.filter(username=username) # 该方法有一个返回值,返回的是一个queryset对象,该对象可以看成是列表套字典的形式,列表里面套着一个个数据对象,形式为:[数据对象1,数据对象2] # queryset列表也支持索引,切片操作,但是不支持负数索引,可以当成列表套字典的形式for循环 user_obj = res[0] # 得到的是具体的数据对象,但是官方不推荐使用索引的方式取到具体的数据对象,它推荐的是res.first()方法取到列表里的第一个数据对象! print(user_obj.username) # 通过点大法,即.属性的方法得到具体的值
2.all()查询所有方法
# all方法查询User表的所有数据,返回的是一个queryset对象列表, user_queryset = models.User.objects.all()
2.4.2单表数据的增加
1.create()方法
# create增加数据方法,语法是:models.类名.objects.create() res = models.MyModle.objects.create(username=username,password=password) # 该方法也有一个返回值,返回的是当前这个数据对象 print(res.username,res.password) # 可以通过点属性的方法,查看到对应属性的值
2.save()方法
obj = models.User(username=username,password=password) obj.save() # 保存数据到数据库
2.4.3单表数据的修改
1.upadte()方法:先查出来,在更新
# 查出id为什么的对象,然后进行批量更新。filter可以查所有,也可以查具体 models.User.objects.filter(id=edit_id).update(username=username,password=password)
2.赋值+save()方法
obj = models.User.objects.filter(id=edit_id).first() #拿到待修改的对象 obj.username = username # 采用给该对象属性重新赋值的方法修改数据 obj.password = password obj.save() # 最后赋值完记得需咬保存
2.4.4单表数据删除
1.delete()方法:用于批量删除
# 先filter查出需要删除的对象,然后.delete()方法 models.User.objects.filter(id=delete_id).delete() # 这里是把filter查出来的queryset对象里全部删除了,有几个删几个。 # 这里的id可以改写成pk,用了pk就不需要知道表的主键是id还是其他什么了!
2.单一删除
res = models.User.objects.filter(id=delete_id).first() res.delete() # 单一删除
2.4.5补充13条单表查询
# 1.all() 查询所有数据 # 2.filter() 带有过滤条件的查询,拿到的是一个queryset对象列表 # 3.get() 直接拿数据对象 但是条件不存在直接报错 # 4.first() 拿queryset里面第一个元素 # res = models.User.objects.all().first() # print(res) # 拿到queryset对象列表里的第一个数据对象 # 5.last() # res = models.User.objects.all().last() # print(res) # 同上,拿到的是最好一个 # 6.values() 可以指定获取的数据字段 select name,age from ... # res = models.User.objects.values('name','age') # print(res) # 结果为:列表套字典 # 7.values_list() # res = models.User.objects.values_list('name','age') # print(res) # 结果为:列表套元祖, # 8.query # print(res.query) # 查看内部封装的sql语句 # 上述查看sql语句的方式 只能用于queryset对象 # 只有queryset对象才能够点击query查看内部的sql语句 # 9.distinct() 去重 # res = models.User.objects.values('name','age').distinct() # print(res) """ 去重一定要是一模一样的数据 如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键 """ # 10.order_by() # res = models.User.objects.order_by('age') # 默认升序 # res = models.User.objects.order_by('-age') # 降序 # print(res) # 10.reverse() 反转的前提是 数据已经排过序了 order_by() # res = models.User.objects.all() # res1 = models.User.objects.order_by('age').reverse() # print(res,res1) # 11.count() 统计当前数据的个数 # res = models.User.objects.count() # print(res) # 12.exclude() 排除在外 # res = models.User.objects.exclude(name='jason') # print(res) # 13.exists() #基本用不到因为数据本身就自带布尔值 返回的是布尔值 # res = models.User.objects.filter(pk=10).exists() # 判读主键为10的是否存在,返回是布尔值 # print(res) 2.4.6 神奇的双下划线查询
__exact:等值查询 __contains:包含指定值--区分大小写 a2=Book.objects.filter(name____contains=‘n') 查询出名字里包含n的 __icontains:包含指定值--忽略大小写 __startwith:以xxx开始 __endwith:以xxx结尾 __gt:大于指定值,例如:a2=Book.objects.filter(id__gt=3) __gte:大于等于 __it:小于 __ite:小于等于 __in:查找数据是否在指定范围内 a2=Book.objects.filter(id__in=[1,3,5]) __range:查询数据是否在指定区间范围内 a2=Book.objects.filter(id__range=[1,5]) 查询出id在1-5的收尾都要 a2=Book.objects.filter(register_time__month='1'):查询出月份是1月的数据 a2=Book.objects.filter(register_time__year='2022'):查询出年份在2022的数据
2.5 多表数据操作
2.5.1 orm创建表关系
表的关系有三种,分别是:一对一、一对多、多对多
判断表和表之间的关系:换位思考法
具体创建表关系语法:
""" 图书和出版社:一对多关系,外键建在多的一方 图书和作者:多对多关系,外键建在任何一方,但是推荐建在查询频率高的一方 作者和作者详情:一对一关系,外键建在任何一方,但是推荐建在查询频率高的一方 """ class Book(models.Model): title = models.CharField(verbose_name='书名',max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2) create_time = models.DateTimeField(auto_now_add=True) # 一对多外键建在多的一方,to='是需要建立外键的那一个类名publish' # 注意:在django2、3里面需要指定级联删除参数on_delete=models.CASCADE publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 多对多外键建在查询频率高的一方,多对多在sql语句中需要自己手动建第三张表,但是在django中,django遇到会自动帮你创建第三张表! author = models.ManyToManyField(to='Author') class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=64) email = models.EmailField() class Author(models.Model): name = models.
相关内容
- python中list列表删除元素的四种方法实例_python_
- Python实现疫苗接种管理数据库步骤详解_python_
- Python运维自动化之paramiko模块应用实例_python_
- python中Requests发送json格式的post请求方法_python_
- python pip特殊用法之pip install -v -e .命令详解_python_
- Pytest运行及其控制台输出信息_python_
- Python中turtle库常用代码汇总_python_
- Python封装解构以及丢弃变量_python_
- Python+eval函数实现动态地计算数学表达式详解_python_
- 利用Python+eval函数构建数学表达式计算器_python_
点击排行
本栏推荐
