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