Django——数据库
django在操作数据库
1、配置好要连接的数据库 2、定义模型类 3、迁移数据库 4、使用类对象方式操作数据库
数据迁移的命令
python manage.py makemigrations python manage.py migrate
字段的增删改
class stu(models.Model): # 迁移结束之后 , 在数据库中会生成一个当前所在应用的应用名与类名组合,就是一个表名 # 表名: app01_stu # 当我们设置模型类的时候没有定义一个叫id的主键自增字段 , # 那么django会自动的生成这个id的主键字段 name = models.CharField(max_length=10) # 增加 , 修改 , 删除字段直接在所在类中修改即可 ,修改结束之后重新迁移数据库 # 在增加字段的时候 , 给字段设置允许为空 , 或者设置默认值 gender = models.CharField(max_length=1,blank=True)
class Student(models.Model): # 字符串字段必须设置最大长度 name = models.CharField(max_length=10) age = models.IntegerField() # height double(3,2) 1.23 # 设置数字位数 , 以及小数位数 # DecimalField浮点型数据 height = models.DecimalField(max_digits=3 , decimal_places=2) # 日期类型 day = models.DateField() # 选择字段类型 # 选择字段需要先定义好选项列表或者元组 gender_cho = ( #(选择字符 , 选项内容) ('1', '男'), ('2', '女'), ) # 指定选项内容 gender = models.CharField(choices=gender_cho , max_length=1) class Meta: # 自定义表名 db_table = 'student'
django对数据表进行增删改查操作有两种方式:使用原始的SQL语句操作,一种是使用SQL的模型类对象操作。
1、数据操作一
使用原始SQL操作,django提供了两种方式执行原始的SQL语句 , 一个使用模型管理器raw()
方法来执行 , 一个是直接使用元素的SQL语句 操作。
1.1 使用raw方法操作原始SQL
如果要写原始的SQL语句 , 就用这种方法比较安全。
raw执行之后返回的是一个对象
# 原始SQL语句操作——raw方法 # 添加数据 sql = "insert into student(name , age , height , day , gender) values" \ "('叶鹏飞', 18 , 1.79 , '2023-4-3' , '1')" data_add = Student.objects.raw(sql) # 对操作数据的执令需要执行提交操作 # data_add.query._execute_query() # 修改数据 sql = "update student set age= 28 where id=4" data_update = Student.objects.raw(sql) # data_update.query._execute_query() # 删除数据 sql = "delete from student where id =1" data_del = Student.objects.raw(sql) # data_del.query._execute_query() # 查询语句 # 类名.objects.raw(sql语句) ,返回的是一个对象;RawQuerySet data = Student.objects.raw('select * from student') print(data) # 获取到对象中的数据 , 需要使用到for循环 for i in data: print(i.name , i.age , i.day)
1.2 直接执行原始的SQL语句
这种方式会存在SQL注入的问题。这种方式不使用django提供的模型方法。
调用django.db.connection.cursor()的游标对象进行操作
# 第二种直接执行sql语句 from django.db import connection # 创建游标对象 , 执行SQL语句 : cur.execute cur = connection.cursor() # 修改数据 cur.execute('update student set age=20 where id=3') # 删除数据 cur.execute("delete from student where id =3") # 查询数据 cur.execute('select * from student') data = cur.fetchone() print(data)
2、数据操作二
使用django提供的模型方法进行操作数据
1、添加 , 查询数据
# 使用django提供的模型方法操作数据 # 添加数据 # 方式一 # data = Student.objects.create(name='阿宸' , age=26 , gender='1', # day='1997-5-27', height=1.79) # 方式二添加数据 , 这种需要执行一个保存数据的方法 save data = Student(name='张迦博' , age=20 , gender='1', day='2000-1-1',height=1.80) # data.save() # 查询数据 all() ,返回的是一个对象 # select * from student get_data = Student.objects.all() print(get_data) for data in get_data: print(data.name , data.age) # values , 在获得到的对象中 , 将对象的数据以字典的类型显示出来 get_data = Student.objects.all() print(get_data.values()) # filter 根据指定的条件获取数据 get_data = Student.objects.filter(name='阿宸') print(get_data.values())
3、SQL注入(了解)
SQL注入:通过某种方式在参数位置写入SQL代码 , 那么代码目的不纯,这时候数据库会受到攻击 , 或者跳过验证获取数据。是黑客最常用的手段。
在获取数据前 ,对数据进行判断。
from django.shortcuts import render , HttpResponse from app01.models import user # Create your views here. def login(request): if request.method == 'POST': name = request.POST.get('user') pw = request.POST.get('password') # from django.db import connection # # # 创建游标对象 , 执行SQL语句 : cur.execute # cur = connection.cursor() # # 密码: 123' or 1=1 # # 把需要进行条件判断的内容变成字符串 ,不进行筛选 # cur.execute(f'select * from user where name="{name}" and pwd={pw}') # data = cur.fetchone() data = user.objects.filter(name=name , pwd=pw) if data: return HttpResponse('登录成功') else: return HttpResponse('登录失败') return render(request , 'login.html')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏