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

简介

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 公众号同款,欢迎关注!! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

恒运资本:两市迎普涨,创业板指涨超3%,汽车配件等板块走强

29日早盘&#xff0c;A股两市低开高走&#xff0c;沪指涨幅超1%&#xff0c;创业板指涨超3%。截至午间收盘&#xff0c;沪指涨1.39%报3141.82点&#xff0c;深成指涨2.41%&#xff0c;创业板指涨3.47%%&#xff0c;两市算计成交6265亿元。北向资金净流入超38亿元。盘面上&#…

手机云控设计思路

本系统为任务分发系统,上游发布任务或者接受其他平台系统分发的任务,对任务进行规则引擎处理后分类,由核心分发系统部分进行对存活的空闲终端进行分发任务,终端做完任务后进行反馈给任务系统. 核心要处理的点是终端存活与空闲的统计、任务平均分布下发给终端的算法,保证分布的…

基于AVR128单片机智能传送装置

一、系统方案 1、板载可变电阻&#xff08;电位器&#xff09;R29的电压作为处理器ATmega128的模数转换模块中单端ADC0的模拟信号输入&#xff08;跳线JP13短接&#xff09;。 2、调节电位器&#xff0c;将改变AD转换接口ADC0的模拟信号输入&#xff0c;由处理器完成ADC0的A/D转…

Qt:界面实时响应鼠标拖动绘制

采用双缓冲实现界面实时响应鼠标的拖动绘制。 思想如下&#xff1a;首先需要两张画布pix和tempPix&#xff0c;他们都是QPixmap实例&#xff1b;pix用来保存初始界面或上一阶段以完成的绘制&#xff1b;tempPix用来作为鼠标拖动时的实时界面绘制&#xff1b;当鼠标左键按下后拖…

vue 使用C-Lodop打印小票

先从官网下载js文件 https://www.lodop.net/LodopDemo.html 打开安装程序&#xff0c;一直下一步既可&#xff0c;我这边已经安装过就不演示了。 // 引入 import { getLodop } from /utils/CLodopfuncs.js;// 使用 let LODOP getLodop()let Count LODOP.GET_PRINTER_COUNT…

串行FIR滤波器

串行 FIR 滤波器设计 串行设计&#xff0c;就是在 16 个时钟周期内对 16 个延时数据分时依次进行乘法、加法运算&#xff0c;然后在时钟驱动下输出滤波值。考虑到 FIR 滤波器系数的对称性&#xff0c;计算一个滤波输出值的周期可以减少到 8 个。串行设计时每个周期只进行一次乘…

npm install sentry-cli失败的问题

1. 目前报错 2. 终端运行 npm set ENTRYCLI_CDNURLhttps://cdn.npm.taobao.org/dist/sentry-cli npm set sentrycli_cdnurlhttps://cdn.npm.taobao.org/dist/sentry-cli3. 再安装 npx sentry/wizardlatest -i nextjs即可成功

蓝牙模块产品认证-国际市场准入准则之加拿大IC认证基础知识

蓝牙模块产品认证-国际市场准入准则之加拿大IC认证基础知识 一&#xff1a;前言加拿大IC介绍 1.1&#xff1a;IC更名 2016年3月加拿大工业部(IC, Industry Canada)正式更名为加拿大创新、科学和经济发展 部(ISED, Innovation, Science and Economic Development Canada) ISED…

汇编-内中断

中断的意思是指, CPU不再接着(刚执行完的指令) 向下执行, 而是转去处理这个特殊信息。 8086CPU,当CPU内部有下面的情况发生的时候, 将产生相应的中断信息: (1)除法错误, 比如, 执行div指令产生的除法溢出; (2)单步执行;   (3)执行into指令; (4)执行int指令。 CPU…

双基证券:预计未来还会有更多政策来吸引增量资金

双基证券表明&#xff0c;8月27日&#xff0c;活泼资本商场五大方针出台&#xff1a;证券买卖印花税折半征收&#xff1b;阶段性收紧IPO节奏&#xff1b;上市房企再融资不受破发、破净和亏损限制&#xff1b;规范控股股东与实践操控人减持行为&#xff1b;融资保证金最低份额由…

homeassistant ubuntu自启动 网络设置

命令行安装virtualbox 或者安装包 hass官网下载 haos_ova-10.4.vdi virtualbox 装hass 最少2G内存 其他省略 自启动&#xff1a; gnome-session-properties 添加 VBoxManage startvm hass --type headless hass为自己的虚拟机名字 网络配置如下&#xff1a; 要全部打开

图像扭曲之锯齿

源码&#xff1a; void wave_sawtooth(cv::Mat& src,cv::Mat& dst,double amplitude,double wavelength) {dst.create(src.rows, src.cols, CV_8UC3);dst.setTo(0);double xAmplitude amplitude;double yAmplitude amplitude;int xWavelength wavelength;int yWave…

checkstyle检查Java编程样式:识别应该被定义为final的类

介绍 总体说明 checkstyle可以使用FinalClass检查应该被定为final的类。如果违反了&#xff0c;就会报违反项&#xff1a; https://checkstyle.sourceforge.io/checks/design/finalclass.html checkstyle规则集文件对FinalClass模块的配置&#xff1a; 哪些类可以被定义fi…

【整合一切08/8】:用变压器实现语言翻译

一、说明 这里是国外高手实现德语-英语互译的变压器模型&#xff1b;这是“已实现的变压器”系列最后一篇文章。编码器和解码器相结合&#xff0c;创建了一个能够轻松将德语翻译成英语的模型。 图片来源&#xff1a;作者 本系列的前七篇文章详细研究了变压器的组件&#xff1a;…

数据结构——栈

栈 栈的理解 咱们先不管栈的数据结构什么&#xff0c;先了解栈是什么&#xff0c;栈就像一个桶一样&#xff0c;你先放进去的东西&#xff0c;被后放进的的东西压着&#xff0c;那么就需要把后放进行的东西拿出才能拿出来先放进去的东西&#xff0c;如图1&#xff0c;就像图1中…

【缓存设计】记一种不错的缓存设计思路

文章目录 前言场景设计思路小结 前言 之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路&#xff0c;觉得不错&#xff0c;做个记录供以后参考。 场景 假设有个以下格式的接口&#xff1a; GET /api?keys{key1,key2,key3,...}&types{1,2,3,...}其中 keys 是业务…

小研究 - J2EE 应用服务器的软件老化测试研究

软件老化现象是影响软件可靠性的重要因素&#xff0c;长期运行的软件系统存在软件老化现象&#xff0c;这将影响整个业务系统的正常运行&#xff0c;给企事业单位带来无可估量的经济损失。软件老化出现的主要原因是操作系统资源消耗殆尽&#xff0c;导致应用系统的性能下降甚至…

sql:SQL优化知识点记录(五)

&#xff08;1&#xff09;explain之例子 &#xff08;2&#xff09;索引单表优化案例 上面的功能已经实现&#xff0c;但是分析功能&#xff0c; 使用explain分析这条sql&#xff1a; 发现type为All Extra&#xff1a;有Using filesort &#xff08;文件内排序&#xff09; 这…

Java学数据结构(4)——散列表Hash table 散列函数 哈希冲突

目录 引出散列表Hash table关键字Key和散列函数(hash function)散列函数解决collision哈希冲突&#xff08;碰撞&#xff09;分离链接法(separate chaining)探测散列表(probing hash table)双散列(double hashing) Java标准库中的散列表总结 引出 1.散列表&#xff0c;key&…

ssm+vue校园活动管理平台源码和论文

ssmvue校园活动管理平台源码和论文090 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 使用旧方法对校园活动信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园活动信…