首页 > 数据库 >Django——数据库

Django——数据库

时间:2023-06-08 13:46:03浏览次数:48  
标签:name 数据库 django objects SQL Django data cur

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')

标签:name,数据库,django,objects,SQL,Django,data,cur
From: https://www.cnblogs.com/fhy-blog/p/17466222.html

相关文章

  • Django——数据库2
    Django——数据库2添加数据#添加数据#1、使用create方法#data=Students.objects.create(name='阿宸',age=26,gender='2',height=1.79)#2、直接写入数据,写入完之后,必须使用save方法保存data=Students(name='叶鹏飞',age=19,gender='2',height=1.......
  • Django——模板
    Django——模板模板:django对模板文件没有特别大的限制,html,txt,没有类型的文件。django提供一种动态生成html页面的快捷方式,也就是模板。模板语言(DTL)1、配置模板pycharm创建django项目会自动将我们的模板templates配置好。#django的默认模板引擎;django也支持并且内......
  • 图数据库HugeGraph——这个无非是利用cassandra+ES作为后端来做的图数据库,支持分布式
    HugeGraph介绍#以下引自官方文档:CopyHugeGraph是一款易用、高效、通用的开源图数据库系统(GraphDatabase,GitHub项目地址),实现了ApacheTinkerPop3框架及完全兼容Gremlin查询语言,具备完善的工具链组件,助力用户轻松构建基于图数据库之上的应用和产品。HugeGraph支持百亿以上的顶点......
  • KingbaseES数据库配置Hikari数据源
     Hikari是一个高性能的数据库连接池,它是SpringBoot2.x中的默认数据源。一、下载驱动打开下面网址:选择对应平台的jdbc驱动程序。人大金仓-成为世界卓越的数据库产品与服务提供商(kingbase.com.cn)这里以x86平台为例:下载完成后目录里面包含以下文件:根据项目的JDK版本选择......
  • 008 数据库学习笔记--触发器
    主要内容来自:https://blog.csdn.net/KingCruel/article/details/106292310https://blog.csdn.net/qq_36330228/article/details/90582493触发器:触发器,可理解为一种特殊的存储过程。是一个特殊的事务(在执行过程中,可执行一些检查或设置条件,不满足时,可回滚操作)存储过程,通过存......
  • 10_How deploy a Django application using Nginx & Gunicorn in Production
     地址:https://www.codewithharry.com/blogpost/django-deploy-nginx-gunicorn/  HowtohostDjangoApplicationusinggunicorn&nginxinProductionInthispost,wewillseehowtousenginxwithgunicorntoservedjangoapplicationsinproduction. Dj......
  • Django实现crontab远程任务管理系统
    前面有文章介绍过使用django-crontab和apscheduler模块管理Django本身应用的定时任务。注意这里说的是Django本身应用的定时任务,也就是说定时任务本身是Django应用中的对应的函数功能。• django任务管理之crontab[1]• django任务管理-apscheduler[2]这里也大概总结下dja......
  • JAVA的springboot+vue企业客户信息反馈平台,附源码+数据库+文档+PPT
    1、项目介绍企业客户信息反馈平台能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知企业客户信息反馈平台的便捷高效,不仅为客户提供了服务,而且也推广了自己,让更多的客户了解自己。对于企业客户信息反馈而言,若拥有自己的平台,通过平台得到更好的管理,同时提升了形象......
  • 软测5班数据库基础知识
    函数:字符串函数charindex('查找内容','源字符串'[,起始位置]),返回值为查找到的内容首字母所在的位置,如果未找到返回0。len('字符串'),返回字符串长度。lower('字符串'),返回小写字母。upper('字符串'),返回大写字母。ltrim('字符串'),返回去除字符串左边空格。rtrim('字符串'),返......
  • clickhouse读写数据库3-- clickhouse_driver 模块
    这是用百度的文心一言生成的代码。刚开始2次都是错误的,明确指出clickhouse_driver没有占位符,让AI重新生成。重新生成了2次之后,才得到正确代码  #!/usr/bin/envpython#-*-coding:utf-8-*-#author:henry#desc:整理clickhouse读写的范例,方便日后读写click......