Python(Web时代)—— Django数据库整合

news2025/3/16 18:54:18

简介

ORM框架介绍

ORM(Object Relation Mapping)框架,可以帮助我们把类和数据表进行一个映射,让我们可以通过类和类对象来直接操作数据库中的数据。

优势:根据对接的数据库引擎翻译成对应的sql语句,所以我们不用关注使用的是MySQL还是Oracle等,我们只需要修改数据库配置即可

django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

模型

Django 中模型是真实数据的描述,它包含了储存的数据所必要的字段和行为,在创建模型前需要先配置好数据库。每一个模型类即对应一个数据表

数据库配置

Python 内置 SQLite,如果使用SQLite则无需安装额外东西。

以下以TestDjango项目为例 ,我们使用 mysql 数据库

一、数据库连接配置

在 TestDjango 项目目录下,打开 TestDjango/settings.py 配置文件,修改DATABASES 中的数据库信息(默认是sqlite)

# TestDjango/settings.py

DATABASES = {
    'default': {
        # 指定当前使用的数据库引擎
        # django.db.backends.mysql、oracle、sqlite3
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',  # 数据库
        'USER': 'root',       # 用户名
        'PASSWORD': '123456', # 密码
        'PORT': 3306,   # 数据库的端口号
        'HOST': 'localhost' # 主机ip
    }
}

然后在settings.py所在目录下的__init__py文件中设置Django默认连接MySQL的方式

# TestDjango/__init__py

import pymysql
pymysql.install_as_MySQLdb()

图片

二、创建模型

为了避免不同数据库sql不一样的情况,django统一采用 模型类,模型类 定义在 应用的models.py 文件中

以之前创建的评分系统(scroe)为例,创建两个模型 Student 和 Address

通过编辑 score/models.py 文件定义出来

from django.db import models
class Student(models.Model):
    # 模型类中不需要指定 id字段,会自动生成

    # 数据库的可变字符串类型   varchar(20)
    name = models.CharField(max_length=20)
    age = models.IntegerField()
    create_time = models.DateTimeField('创建时间')

    def __str__(self):
        # 对象的描述信息, 此时查看对象,已经不是默认的对象地址,而是学生的名称
        return self.name

    # 元选项一定属于模型类中的一部分,不能单独使用
    class Meta:
        db_table = 'student'  # 指定表名, 默认为 app名_模型类名
        verbose_name = '学生表'
        verbose_name_plural = verbose_name  


class Address(models.Model):
    # CASCADE:当父表数据删除时,相对应的从表数据会被自动删除
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    detail = models.CharField(max_length=200)

注:

  • 每个模型被定义为 django.db.models.Model 类的子类

  • 每个 Field 类实例变量的名字也是字段名,如 create_time,定义时需要遵循数据库字段规则

  • 可以定义备注名,方便代码理解,如 create_time= models.DateTimeField('创建时间')

常用字段类型

类型描述
CharField字符串类型(必加 maxlength)
IntegerField整数类型
FloatField小数类型
DateTimeField日期+时间 类型
DateField日期类型
DecimalField(精确)小数 类型

三、安装应用

现在需要将 score 应用安装到我们 TestDjango 项目中。

首先打开 TestDjango/settings.py 配置文件,在 INSTALLED_APPS 中添加 score 应用的点式路径 'score.apps.ScoreConfig',配置完成如下所示:

# TestDjango/settings.py

INSTALLED_APPS = [
    'score.apps.ScoreConfig',   #新增polls路径
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

注:因为 ScoreConfig类写在文件 score/apps.py 中,所以它的点式路径是 'score.apps.ScoreConfig'

四、迁移(makemigrations)

模型类创建好后,将模型类迁移到数据库(迁移是 Django 对于模型定义即数据库结构的变化的储存形式)

在终端执行迁移命令,会在对应app下生成一个迁移文件migrations 用来记录数据库迁移的信息

如果数据库出错,需删库重创时,必须把migrations 文件删掉再重新创建,否则报错

# 生成迁移文件
python manage.py makemigrations score

# 执行迁移文件同步数据到数据库
python manage.py migrate

生成迁移文件

图片

同步数据库

图片

成功后,数据库中将出现以下表

图片

注:执行以上命令如果报以下错时

图片

解决:修改__init__.py 文件,指定版本:pymysql.version_info = (1, 4, 3, "final", 0) 

然后再重新执行迁移文件的命令即可

图片

数据库操作

新增数据

编辑 TestDjango 项目下score/views.py 文件代码,通过访问URL 在 Student 模型对应表中添加数据

# score/views.py

from django.http import HttpResponse
# Create your views here.
from score.models import Student, Address
from django.utils import timezone


def index(request):
    return HttpResponse("这是一个评分系统!!!")


# 添加学生
def add_student(request):
    student = Student(
        name="张三",
        age=22,
        create_time=timezone.now()
    )
    student.save()
    return HttpResponse("新增学生成功!!!")

再编辑 score/urls.py 文件代码,新增一条路由,代码如下:

# score/urls.py

urlpatterns = [
    path('', views.index, name='index'),
    path('add_student', views.add_student, name='add_student'),  #新增add_student路由
]

最后,通过 python manage.py runserver 127.0.0.1:8080 命令启动本地开发服务器,启动后在浏览器中输入URL地址 http://127.0.0.1:8080/score/add_student

图片

修改数据

和新增数据一样,再次编辑 TestDjango 项目下 score/views.py 文件,添加修改方法,并在score/urls.py 添加一条路由

# 修改学生
def update_student(request):
    student = Student.objects.get(id=1)
    student.name="李四"
    student.save()

    # 或者通过条件过滤的方式也可以修改
   # Student.objects.filter(id=1).update(name='李四')

    return HttpResponse("修改学生成功!!!")

删除数据

添加修改方法,并在score/urls.py 添加一条路由

# 删除学生
def del_student(request):
    student = Student.objects.get(id=1)
    student.delete()

    # 或者通过条件过滤的方式
   # Student.objects.filter(id=1).delete()

    return HttpResponse("删除学生成功!!!")

查询数据

再次编辑 TestDjango 项目下 score/views.py 文件,添加查询方法,并在score/urls.py 添加一条路由

def query(request):
    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM student
    studentList = Student.objects.all()
    # 获取单个对象
    response2 = Student.objects.get(id=2)
    # 相当于SQL中的WHERE id=2,可设置条件过滤
    response3 = Student.objects.filter(id=2)
    # 根据id字段排序
    response5 = Student.objects.order_by("id")


    # 模糊查询  (字段名__contains)判断是否包含,如果要包含%无需转义,直接写即可
    response = Student.objects.filter(name__contains="三")
    # startswith、endswith :以指定值开头或结尾
    response = Student.objects.filter(name__startswith="三")
    response = Student.objects.filter(name__endswith="三")

    #  空查询 isnull 是否为空 Flase/True
    response = Student.objects.filter(name__isnull=False)

    #in范围查询
    response = Student.objects.filter(id__in=[2,3])

    # 比较查询
    # gt :大于(greater then)
    # gte:大于等于(greater then equal)
    # lt :小于(less then)
    # lte :小于等于(less then equal)
    # 查询id大于2的数据
    response = Student.objects.filter(id__gte=2)

    # Q查询
    # 多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
    # & 表示逻辑与、and,| 表示逻辑或、or
    # 查询id大于2 并且 age大于20的数据
    response = Student.objects.filter(id__gt=2, age__gt=20)
    response = Student.objects.filter(Q(id__gt=2) & Q(age__gt=20))
    # 查询id大于2 或者 age大于20的数据
    response = Student.objects.filter(Q(id__gt=2) | Q(age__gt=20))

    res = ""
    # 遍历所有对象
    for q in studentList:
        res += str(q.id) + "." + q.name + " <br />"

    return HttpResponse("查询所有学生:<br />" + res)

注:查询单个数据 get(id=1)  与  filter(id=1) 的区别:

  • get( id =1):返回模型实例对象,如果查询结果不存在或者有多个,会抛出异常

  • filter(id=1):返回模型实例对象的Set集合,如果查询结果不存在会返回空集合,如果有多个则返回的集合中包裹多个模型对象

score/urls.py 文件代码

图片

程序猿与投资生活实录已改名为  程序猿知秋,WX 公众号同款,欢迎关注!! 

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

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

相关文章

平均值和方差的点估计、区间估计

0&#xff0c;预备知识 0.1&#xff0c;中心极限定理 0.2&#xff0c;均值的标准误差 0.3&#xff0c;卡方分布 1&#xff0c;总体均值的无偏估计量 2.1&#xff0c;当总体方差已知时对样本均值的描述&#xff08;Z统计量&#xff09; 2.2&#xff0c;当总体方差未知时对样本均…

RabbitMq深度学习

什么是RabbitMq? RabbitMQ是一个开源的消息队列中间件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。它被广泛用于分布式系统中的消息传递和异步通信。RabbitMQ提供了一种可靠的、可扩展的机制来传递消息&#xff0c;使不同的应用程序能够相互之间进行…

成都优优聚:美团代运营趋势在哪儿?

美团代运营作为一种经营模式&#xff0c;在当今日益竞争激烈的市场中扮演着重要的角色。它为商家提供了全方位的服务&#xff0c;从市场推广到订单管理&#xff0c;从团购券的制作到售后服务&#xff0c;帮助商家解决了运营中的各种难题。 首先&#xff0c;美团代运营的核心优势…

重磅OpenAI发布ChatGPT企业版本

8月29日凌晨&#xff0c;Open AI官网发布ChatGPT企业版本&#xff01; 企业版简介&#xff1a; ChatGPT企业版提供企业级安全和隐私、无限的高速 GPT-4 访问、用于处理更长输入的更长上下文窗口、高级数据分析功能、自定义选项等等。人工智能可以协助和提升我们工作生活的各个…

DEA创建maven项目,项目结构无src目录和pom.xml文件内容

File > Settings > Build,Execution,Deployment > Build Tools > Maven > Runnner,界面中VM Options 输入框中填入-DarchetypeCataloginternal&#xff0c;重启IDEA&#xff0c;打开即会有src目录和pom.xml文件。 -DarchetypeCataloginternal -DarchetypeCatal…

【校招VIP】产品思维设计之用户需求分析

考点介绍&#xff1a; 理解用户需求时需要我们在看待产品的时候不能以我们创造者的专业身份来看&#xff0c;而需要用同理心&#xff0c;将自己转变为一个产品的典型用户&#xff0c;才能准确挖掘到用户心底最真实的诉求。 『产品思维设计之用户需求分析』相关题目及解析内容可…

新版白话空间统计(26)标准距离

前文再续&#xff0c;书接上一回。 上次我们讲了方向分布工具&#xff0c;这个工具会生成一个标准差椭圆&#xff0c;其中有这样的一句话描述&#xff1a; “短半轴表示数据分布的范围&#xff0c;短半轴越短&#xff0c;表示数据呈现的向心力越明显&#xff1b;反之&#xf…

探索OLED透明屏的优缺点:引领科技未来的革命性突破

OLED透明屏作为一项革命性的创新技术&#xff0c;其令人惊叹的透明度和柔性性能引起了全球范围内的关注。 然而&#xff0c;了解OLED透明屏的优缺点对于我们全面认识其在科技未来中的地位至关重要。 今天&#xff0c;尼伽将深入探讨OLED透明屏的优势和限制&#xff0c;并借助…

耐世特Nexteer EDI解决方案

耐世特Nexteer曾经为美国通用汽车全资子公司&#xff0c;是一家集研发、制造、销售于一体的全球化集团公司。耐世特汽车系统公司是转向系统及相关先进技术的全球供应商。该公司为60多家汽车制造商设计、制造、销售电动助力转向器、液压助力转向器、转向管柱和传动轴产品&#x…

Nacos基础(3)——nacos+nginx 集群的配置和启动 端口开放 nginx反向代理nacos集群

目录 引出nacos集群nginx反向代理nacos集群停止单例nacos准备8848和8858修改cluster.conf配置【配置】修改启动配置文件【配置】开放8858的端口分别以集群方式启动【启动】前端访问查看生产者测试8858nacos nginx反向代理配置代理tcp代理http启动nginx反向代理容器生产者访问测…

C++内存分区模式

内存分区模型 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编辑器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量等堆区&#xff1a;由程序员分配和释放&#…

【操作记录】pytorch_geometric安装方法

pytorch_geometric安装方法 github地址 主要不要直接pip install安装&#xff0c;会由于依赖无法安装而失败 点击here手动安装依赖 选择对应的pytorch版本&#xff0c;我的是Win10 Python3.8.3Pytorch1.8.1CUDA10.2 手动下载四个依赖包本地安装&#xff1a; 主要不要直接&am…

高效高精分板的关键驱动装置:PCB分板机切割主轴

随着电子制造业的快速发展&#xff0c;分板机成为了一种必不可少的生产设备&#xff0c;PCB分板机切割主轴作为关键驱动装置&#xff0c;扮演着重要的角色。 PCB分板机切割主轴由电机、轴承、传动系统和控制系统等组成。电机产生的动力通过传动系统传递给主轴&#xff0c;主轴…

项目经理常用工具01

主要工具 表达工具—SCRTV方法 情境 Scene&#xff1a;明确问题&#xff1a;是什么&#xff1f;冲突 Confilict&#xff1a;提出疑问&#xff1a;怎么了?原因 Reason&#xff1a;分析原因&#xff1a;为什么&#xff1f;策略 Tactics&#xff1a;进行决策&#xff1a;怎么办…

运用Python解析HTML页面获取资料

在网络爬虫的应用中&#xff0c;我们经常需要从HTML页面中提取图片、音频和文字资源。本文将介绍如何使用Python的requests库和BeautifulSoup解析HTML页面&#xff0c;获取这些资源。 一、环境准备 首先&#xff0c;确保您已经安装了Python环境。接下来&#xff0c;我们需要安…

李宏毅 2022机器学习 HW2 上分路线

baseline增加concat_nframes &#xff08;提升明显&#xff09;增加batchnormalization 和 dropout增加hidden layer宽度至512 &#xff08;提升明显&#xff09; 提交文件命名规则为 prediction_{concat_nframes}[{n_hidden_layers}{dropout}_bn].csv

【Ubuntu】Ubuntu常用软件部署

1.安装jdk1.8 (1).apt方式安装 1).安装 1.在终端中输入以下命令&#xff0c;以更新软件包列表 sudo apt-get update2.在终端中输入以下命令&#xff0c;以安装JDK 1.8 sudo apt-get install openjdk-8-jdk3.将Java 1.8设置为默认版本。在终端中输入以下命令 sudo update-…

忘记密码-小米机型 其他安卓机型账号锁 设备锁的分析与刷写某第三方解锁包输入“注册码”

重要提示&#xff1a; 博文的主要目的是分析安卓机型账号锁的安全性和解决方法。操作仅限于自己的机型忘记密码 手机号不用过了保修期导致无法通过官方解锁的操作&#xff0c;请勿用于非法途径 在开始前。对于锁的认知可以参考这篇博文 安卓搞机玩机-什么是“锁 ” BL锁 屏幕锁…

基于ssm的大型商场会员管理系统源码和论文

基于ssm的大型商场会员管理系统源码和论文084 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 进入信息时代以来&#xff0c;很多数据都需要配套软件协助处理&#xff0c;这样可以解决传统方式带来的管…

JavaWeb之一直摆,一直赶

注解&#xff1a; 注解如果设置了参数的话最后设置默认值&#xff0c;不然容易报错&#xff0c;而且在设置默认值的时候&#xff1a; 自定义注解&#xff1a; 元注解: 对其他注解做出注解 常用元注解&#xff1a; Target:用于描述注解的使用范围&#xff1a; //比如这样一个…