Django调用mysql

Django——数据库

1、ORM

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

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

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

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 类

from django.db import modelsclass 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

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

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

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

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

3、数据操作

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

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()
# 查询数据
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())
# 修改数据
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 语句

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 提供的模型方法

# 添加数据
# 方式一:会返回一个数据对象
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 注入: 通过不正当手段,在参数我盒子写入目的不纯的代码 , 导致数据泄露或者数据库被破坏

from django.shortcuts import render , HttpResponse
from django.views import View
from django.db import connection
from OrmApp.models import Userclass 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 模型类的方式操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel统计分析——一元直线回归

参考资料:生物统计学 两个具有因果关系的协变量如果呈直线关系,可以用直线回归模型来分析两个变量的关系。直线回归(linear regression)是回归分析中最简单的类型,建立直线回归方程并经检验证明两个变量存在直线回归关…

如何使用 templ 在 Go 中编写 HTML 用户界面?

简介 templ 是一个在 Go 中编写 HTML 用户界面的语言。使用 templ,我们可以创建可呈现 HTML 片段的组件,并将它们组合起来创建屏幕、页面、文档或应用程序。 安装 我们可以通过以下两种方式来安装 templ: go 安装 首先,我们需…

软件需求分析报告-word

第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 5.6 其他信息安全措施 第6章 其他非功能需求 6.1 性能设计 6.2 稳定性设计 6.3 安全性设计 6.4 兼容性设计…

C++标准输入输出和名字空间

C标准输入输出和名字空间 标准输入输出 在C中,标准输入输出(I/O)是通过标准库中的iostream库来实现的,它提供了一套流(stream)抽象来进行数据的输入和输出操作。这套流抽象包括输入流用于读取数据&#x…

leetcode 热题 100_合并两个有序链表

题解一: 迭代:分别用两个指针遍历两段链表,逐步比较两链表的节点,将值较大的节点存入新链表,同时指针移动,直到某段链表遍历结束,将另一段链表剩余的节点存入新链表。需要注意存入新链表时要用新…

cad怎么转换成黑白的pdf图纸?分享3个常用的软件!

在工程设计、建筑、机械制造等领域,CAD图纸的应用非常广泛。然而,有时出于某些需要,我们可能需要将CAD图纸转换为黑白的PDF格式。那么,如何实现这一转换呢?本文将为您详细介绍几种常用的转换软件及其操作步骤。 迅捷CA…

Java代码审计安全篇-SSRF(服务端请求伪造)漏洞

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各…

简单的torch网络模型记录

线性dense网络结构,输入(B,W) class Model(nn.Module):def __init__(self):super().__init__()self.media_type_embed nn.Embedding(num_media_type, embed_dim)self.mid_scroe_embed nn.Embedding(num_mid_score, embed_dim)#self.cat torch.cat()self.model …

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+图像缩放,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融合叠加应…

相机模型Omnidirectional Camera(全方位摄像机)

1. 背景 大多数商用相机都可以描述为针孔相机,通过透视投影进行建模。然而,有些投影系统的几何结构无法使用传统针孔模型来描述,因为成像设备引入了非常高的失真。其中一些系统就是全方位摄像机。 有几种方法可以制作全向相机。屈光照相机(D…

Python in Visual Studio Code 2024年3月发布

排版:Alan Wang 我们很高兴地宣布 2024 年 3 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展! 此版本包括以下公告: 新的“Add Imports”代码操作设置调试 Django 或 Flask 应用时自动启动浏览器Python REPL 的 Shell 集成对本…

28 批量归一化【李沐动手学深度学习v2课程笔记】(备注:这一节讲的很迷惑,很乱)

目录 1.批量归一化 1.1训练神经网络时出现的挑战 1.2核心思想 1.3原理 2.批量规范化层 2.1 全连接层 2.2 卷积层 2.3 总结 3. 代码实现 4. 使用批量规范化层的LeNet 5. 简明实现 1.批量归一化 现在主流的卷积神经网络几乎都使用了批量归一化 批量归一化是一种流行且…

树莓派Py程序加入开机自启

创建服务文件 为你的服务创建一个 .service 文件。这个文件通常位于 /etc/systemd/system/ 目录下。例如,如果你的服务名称为 my_python_script.service: sudo nano /etc/systemd/system/my_python_script.service 在打开的编辑器中,输入以下…

利用“定时执行专家”软件的25种任务与12种触发器,提升IT系统管理自动化水平

在IT系统管理中,自动化是提高工作效率、减少人为错误的关键。而《定时执行专家》这款软件,以其强大的功能、易用性和毫秒级的执行精度,成为了IT系统管理员的得力助手。今天,我们就来探讨一下如何利用这款软件的25种任务类型和12种…

Day37:安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

目录 JNDI注入-RMI&LDAP服务 JNDI远程调用-JNDI-Injection JNDI远程调用-marshalsec JNDI-Injection & marshalsec 实现原理 JNDI注入-FastJson漏洞结合 JNDI注入-JDK高版本注入绕过 思维导图 Java知识点: 功能:数据库操作,文…

python实现冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 以下是用Python实现冒泡排序的代…

Fair Data Exchange:区块链实现的原子式公平数据交换

1. 引言 2024年斯坦福大学和a16z crypto research团队 论文 Atomic and Fair Data Exchange via Blockchain 中,概述了一种构建(包含过期EIP-4844 blobs的)fair data-markets的协议。该论文源自a16z crypto的暑期实习计划,与四名…

Golang 中 map[string]string 如何在 TOML 文件中配置

Go结构体定义 Go结构体定义attributes字段,并且使用了toml标签。例如: type Config struct {Attributes map[string]string toml:"attributes" }TOML文件格式 以attributes为例,TOML文件应该像这样: [attributes] k…

无名管道在进程中使用的方法实战

管道一般是单向的。一个进程往里面写&#xff0c;另一个进程从里面读。 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h>int main() {pid_t pid;int fd[2];int n;char buf[20]; //c…

VUE+VScode+elementUI开发环境

0.vue官方文档 你正在阅读的是 Vue 3 的文档&#xff01; 1.前端准备阶段 VUEVScodeelementUI开发环境 2.Vue外部组件 element-ui 3.angular外部组件 angular-ui 4.教学视频 尚学堂b站视频 5.教学视频配套文档 D:\BaiduNetdiskDownload\025【尚学堂】全新2022版WEB前端为初学者…