Django调用mysql

Django------数据库

1、ORM

ORM 是 Django提供的内置框架 , 是和一些关系型数据库的连接接口,使用类对象的方式操作数据(增删改查)。

ORM 将类对象的操作语句转换为 sql 语句,将在数据库中查询得到的结果转换为对象的格式进行返回

在 Django 中配置 MySQL 数据库 , 先在 MySQL 中创建好数据库

python 复制代码
DATABASES = {
    'default': {
        # 配置数据库引擎 , 使用 MySQL 数据库
        'ENGINE': 'django.db.backends.mysql',
        'HOST' : '127.0.0.1',
        'USER' : 'root',
        'PASSWORD' : 'root',
        # 配置连接的数据库 , 数据库必须先创建 , 才可以进行链接
        'NAME' : 'django_orm'
    }
}

2、模型类

复制代码
1、定义模型类
2、数据迁移
3、通过类对象操作数据(增删改查)

定义模型类 , 在应用中的 models 文件中创建,所有的模型类都要继承 Model 类

python 复制代码
from django.db import models

class Student(models.Model):
    # 数据库中的字段 , 在这里定义属性
    # name char(10)
    # CharField 定义字符类型 , 这个类型字段必须定义最大长度
    #  max_length 定义字段的最大长度
    name = models.CharField(max_length=10)
    # age int
    # IntegerField 定义整型字段
    age = models.IntegerField()
    # height float/double(3 , 2)
    # DecimalField 定义浮点类型
    # max_digits 数据的长度
    # decimal_places 小数位数 
    height = models.DecimalField(max_digits=3 , decimal_places=2)
    # gender enum('男' , '女')
    # 设置选项字段的选项值
    gender_choices = (
        # (选项字符 , 选项内容)
        ('1' , '女'),
        ('2' , '男')
    )
    gender = models.CharField(max_length=1 , choices=gender_choices)
    # 增加字段 , 必须给新增的字段设置默认值 , 或者设置允许为空
    # 字段增加好之后 , 重新迁移再同步数据
    # db = models.CharField(max_length=50 , default='aaa')
    # db = models.CharField(max_length=50 , null=True)

数据迁移

定义完模型类之后,必须进行数据迁移 , 数据库中才能同步到对应的数据表以及数据 。

数据迁移要在项目的终端的操作

第一步: 执行 makemigrations 命令,根据定义的模型类生成迁移文件

复制代码
python manage.py makemigrations

ORM 在执行迁移数据的时候,当模型类没有定义 id 字段,会自动的生成一个主键且自增的字段 ------ id。

第二步: 执行 migrate 命令 , 数据同步到数据库中

复制代码
python manage.py migrate

在定义模型类的时候没有给其对应的数据表表名 , 那么迁移数据到数据库中这个表的表名会默认设置为: 应用名称_类名

python 复制代码
    class Meta:
        # 设置在数据库中的表名
        db_table = 'student'
复制代码
单独操作 orm 进行数据的增删改查
 orm 是依赖 django 环境。
 方式一:
 打开 Django 项目的交互环境
 方式二:
 在测试文件中导入 Django 的启动环境

在 test 文件中导入 django 启动环境

python 复制代码
if __name__ == '__main__':
    import os
    # 导入 django 的环境
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_orm.settings')
    # 启动 django 环境
    import django
    django.setup()

3、数据操作

1、使用 raw 方法操作原始的 SQL

python 复制代码
from OrmApp.models import Student

# 增加数据
sql1 = "insert into student(name , age , height , gender)values('阿宸' , 27 , 1.78 , '2')"
sql2 = "insert into student(name , age , height , gender)values" \
    "('尔康' , 18 , 1.90 , '2')," \
    "('。。' , 18 , 1.80 , '2'),"\
    "('火雷噬嗑',18 , 1.90 , '2'),"\
    "('乘着风',18 , 1.90 , '2'),"\
    "('境界', 18 , 1.90 , '2'),"\
    "('张越',18 , 1.90 , '2')"

# 将 sql 命令交给 raw 方法去执行
# 通过模型类对象进行操作
add_data = Student.objects.raw(sql2)
# 对操作完成之后的对象进行提交
add_data.query._execute_query()
python 复制代码
# 查询数据
sql = "select * from student"
# RawQuerySet 数据查询集 , 是一个对象
data = Student.objects.raw(sql)
print(data)
for i in data:
    # 获取到选项字段的具体值
    # 对象.get_字段名_display()
    print(i.name , i.age , i.get_gender_display())
python 复制代码
# 修改数据
sql = "update student set age=28 where id=1"
update_data = Student.objects.raw(sql)
update_data.query._execute_query()
# 删除数据
sql = "delete from student where id=3"
delete_data = Student.objects.raw(sql)
delete_data.query._execute_query()

2、直接执行原始的 SQL 语句

python 复制代码
from django.db import connection
# 创建游标
cursor = connection.cursor()
sql = "insert into student(name , age , height , gender)values('七零' , 30 , 1.70 , '2')"
# cursor.execute(sql)

sql = "select * from student"
cursor.execute(sql)
data = cursor.fetchall()
print(data)

3、使用 django 提供的模型方法

python 复制代码
# 添加数据
# 方式一:会返回一个数据对象
Student.objects.create(name='小阿宸' , age=1 , height=0.95 , gender='1')
# 方式二:这种方式添加数据必须执行保存
data = Student(name='小七零' , age=3 , height=1.10 , gender='2')
data.save()

# 查询数据
# all 查询表中的所有数据
data = Student.objects.all()
# QuerySet 返回一个查询集对象
print(data)
for i in data:
    print(i.name , i.age , i.get_gender_display())

# filter 相当于 where子句
data = Student.objects.filter(gender='1')
print(data)
for i in data:
    print(i.name, i.age, i.get_gender_display())

4、SQL 注入

SQL 注入: 通过不正当手段,在参数我盒子写入目的不纯的代码 , 导致数据泄露或者数据库被破坏

python 复制代码
from django.shortcuts import render , HttpResponse
from django.views import View
from django.db import connection
from OrmApp.models import User

class LoginView(View):
    def get(self , request):
        return render(request , 'login.html')

    def post(self , request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 通过原始的 SQL 语句操作
        # cursor = connection.cursor()
        # sql = f"select * from user where name='{username}' and pwd='{password}'"
        # # select * from user where name='{username}' and pwd='ac' or 1=1 #'
        # cursor.execute(sql)
        # data = cursor.fetchone()
        
        # 使用 orm 的方式查询数据
        data = User.objects.filter(name=username , pwd=password)
        # 判断是否能够查询出来数据
        if data:
            return HttpResponse('登录成功')
        else:
            return HttpResponse('登录失败')

1、不适用原始的 SQL 语句

2、在数据进行数据库查询之前 , 进行数据检验,校验是否有不合法字符

3、使用 orm 模型类的方式操作

相关推荐
牛奶咖啡131 小时前
MySQL InnoDB Cluster 高可用集群部署与应用实践(下)
数据库·mysql·innodb cluster·mysql router·mysql路由的安装部署·mysql路由的测试·mgr组复制
冻咸鱼9 小时前
MySQL的配置
mysql·配置
虚行11 小时前
Mysql 数据同步中间件 对比
数据库·mysql·中间件
奥尔特星云大使12 小时前
mysql读写分离中间件Atlas安装部署及使用
数据库·mysql·中间件·读写分离·atlas
牛马baby12 小时前
【mysql】in 用到索引了吗?
数据库·mysql·in
-Xie-12 小时前
Mysql杂志(三十)——索引失效情况
数据库·mysql
冼紫菜12 小时前
[特殊字符] 深入理解 PageHelper 分页原理:从 startPage 到 SQL 改写全过程
java·后端·sql·mysql·spring
程序新视界12 小时前
什么是MySQL分区?
数据库·mysql·dba
程序新视界12 小时前
实战技巧:使用冗余查询条件解锁MySQL中的索引
数据库·mysql·dba
weixin_4211334112 小时前
Django 的文档接口
python·django·sqlite