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