深入 Django 模型层:数据库设计与 ORM 实践指南

news2024/11/24 0:54:52

title: 深入 Django 模型层:数据库设计与 ORM 实践指南
date: 2024/5/3 18:25:33
updated: 2024/5/3 18:25:33
categories:

  • 后端开发

tags:

  • Django ORM
  • 模型设计
  • 数据库关系
  • 性能优化
  • 数据安全
  • 查询操作
  • 模型继承

在这里插入图片描述

第一章:引言

Django是一个基于Python的开源Web应用程序框架,它遵循MTV(模型-模板-视图)的设计模式。Django框架的目标是使Web开发变得简单、快速和高效。它提供了许多功能强大且易于使用的工具,包括URL路由、模板系统、表单处理、认证系统等,使开发人员能够专注于业务逻辑的实现而不必从头开始构建基本功能。

模型层在Django框架中起着至关重要的作用。模型是定义数据结构的地方,每个模型类对应数据库中的一个表,模型类的属性对应表中的字段。通过模型层,开发人员可以定义数据的结构、字段类型、约束等,同时利用Django提供的ORM系统来进行数据库操作,使得数据的管理变得简单且高效。

数据库模型设计是指根据应用程序的需求设计数据库表结构的过程。良好的数据库模型设计能够确保数据的一致性、完整性和性能。在设计数据库模型时,需要考虑数据之间的关系、字段类型的选择、索引的添加等因素,以满足应用程序的需求并提高数据库的性能。

ORM(对象关系映射)是一种编程技术,它允许开发人员使用面向对象的方式来操作数据库,而不必直接编写SQL语句。在Django中,ORM系统将数据库表映射为Python类,使得开发人员可以通过简单的Python代码来进行数据库操作,而无需关注底层数据库的细节。ORM的使用简化了数据访问层的开发,提高了代码的可读性和可维护性。通过ORM,开发人员可以更加高效地进行数据库操作,从而加快应用程序的开发速度。

第二章:数据库设计基础

数据库设计的基本原则和范式:

  1. 数据库设计基本原则

    • 实体完整性:确保每个表都有一个主键,并且主键值不为空,不重复,用于唯一标识表中的每一行数据。
    • 域完整性:定义每个字段的数据类型、长度和格式,确保数据的合法性和准确性。
    • 参照完整性:通过外键约束确保表与表之间的关系的一致性,保证外键值在父表中必须存在。
    • 用户定义的完整性:根据具体业务需求定义其他的完整性规则,如触发器、存储过程等。
  2. 数据库范式

    • 第一范式(1NF) :确保每个列都是原子的,不可再分。即每个字段只包含一个值,不包含重复组或数组。
    • 第二范式(2NF) :确保非主键字段完全依赖于主键,消除部分依赖。即每个非主键字段必须完全依赖于主键,而不依赖于主键的一部分。
    • 第三范式(3NF) :确保每个非主键字段之间没有传递依赖,消除传递依赖。即每个非主键字段只依赖于主键,而不依赖于其他非主键字段。
  3. 关系数据库中的概念

    • 表(Table) :用于存储数据的二维结构,由行和列组成。每行代表一个记录,每列代表一个字段。
    • 字段(Field) :表中的一个列,用于存储特定类型的数据,如整数、字符串、日期等。
    • 主键(Primary Key) :唯一标识表中每条记录的字段或字段组合,用于保证数据的唯一性和完整性。
    • 外键(Foreign Key) :用于建立表与表之间的关联,确保数据的一致性。外键是一个字段,引用另一表的主键。

以下是一个关于学生信息表(Students)和课程信息表(Courses)之间关系的示例:

Students 表:

StudentID (Primary Key)StudentNameAgeGender
1John Smith20M
2Jane Doe21F

Courses 表:

CourseID (Primary Key)CourseNameTeacherStudents (Foreign Key)
1Introduction to Computer ScienceAlice1
2Database DesignBob1, 2

在这个示例中,Students 表中的 StudentID 是主键,Courses 表中的 CourseID 是主键,Students 表中的 StudentID 也是 Courses 表中的
Students 字段的外键,用于确保学生和课程之间的关系的一致性。

第三章:Django模型层基础

Django 模型层的作用和优势

Django 模型层是 Django 框架的核心部分,负责与数据库进行交互,用于管理数据库表和字段,以及对数据库进行 CRUD (Create,
Retrieve, Update, Delete) 操作。

Django 模型层的优势:

  1. 对象关系映射(ORM) :Django 模型层使用 ORM 技术,将数据库表抽象为 Python 对象,使开发人员可以使用面向对象的编程方式来操作数据库。
  2. 数据库无关性:Django 模型层支持多种数据库后端,包括 MySQL、PostgreSQL、SQLite 等,使开发人员可以更加灵活地选择数据库。
  3. 自动生成迁移:Django 模型层支持自动生成数据库迁移,可以自动生成数据库表结构,使开发人员不需要手动编写 SQL 语句。
  4. 数据校验:Django 模型层支持自动数据校验,可以确保数据的正确性和完整性。

如何创建一个简单的 Django 模型类

首先,需要在 Django 项目中创建一个应用程序,可以使用以下命令创建:

python manage.py startapp myapp

其中,myapp 是应用程序的名称。

然后,在 myapp 应用程序的 models.py 文件中创建一个模型类,如下所示:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField(default=18)
    gender = models.CharField(max_length=10)

在这个示例中,我们创建了一个名为 Student 的模型类,包含三个字段:name、age 和 gender。其中,name 字段是一个字符串字段,最大长度为
30;age 字段是一个整数字段,默认值为 18;gender 字段是一个字符串字段,最大长度为 10。

最后,需要使用以下命令生成数据库迁移:

python manage.py makemigrations myapp

然后,使用以下命令应用迁移,创建数据库表:

python manage.py migrate

这样,我们就创建了一个简单的 Django 模型类,可以用于对数据库表进行 CRUD 操作。

第四章:模型字段

Django 中常用的模型字段类型

  1. CharField:用于存储短文本字符串,指定最大长度。
  2. IntegerField:用于存储整数值。
  3. TextField:用于存储大文本字段。
  4. BooleanField:用于存储布尔值。
  5. DateField:用于存储日期。
  6. DateTimeField:用于存储日期时间。
  7. ForeignKey:用于定义一对多关系,关联另一个模型的主键。
  8. ManyToManyField:用于定义多对多关系,允许一个记录关联多个其他记录。

如何选择合适的字段类型和选项

  1. 根据数据类型选择字段类型:根据要存储的数据类型选择合适的字段类型,例如存储姓名可以选择 CharField,存储年龄可以选择
    IntegerField。
  2. 考虑数据长度:根据数据长度选择合适的字段类型和选项,例如存储长文本可以选择 TextField,而存储短文本可以选择
    CharField。
  3. 考虑是否需要唯一性:如果需要确保字段值的唯一性,可以使用 unique=True 选项。
  4. 考虑是否允许为空:如果字段值可以为空,可以使用 blank=True 选项。
  5. 考虑默认值:如果字段有默认值,可以使用 default 选项。
  6. 考虑关联关系:如果需要定义模型之间的关联关系,可以使用 ForeignKey 或 ManyToManyField。

总之,选择合适的字段类型和选项需要根据具体的业务需求和数据特点来决定,尽量使字段类型和选项能够准确地反映数据的特性,并确保数据的完整性和一致性。在设计模型时,可以根据实际情况灵活选择字段类型和选项。

第五章:模型关系

Django 中不同模型之间的关系

  1. 一对一关系(OneToOneField) :一个模型实例只能对应另一个模型实例,例如一个人只能有一个身份证号码。
  2. 一对多关系(ForeignKey) :一个模型实例可以对应多个另一个模型实例,例如一个作者可以写多篇文章。
  3. 多对多关系(ManyToManyField) :多个模型实例可以互相关联,例如一个标签可以对应多篇文章,一篇文章也可以对应多个标签。

如何在模型中定义和使用这些关系

  1. 一对一关系:在定义模型时,使用 OneToOneField 字段类型来定义一对一关系,例如:

    from django.db import models
    
    class Person(models.Model):
        name = models.CharField(max_length=50)
    
    class IDCard(models.Model):
        number = models.CharField(max_length=18)
        person = models.OneToOneField(Person, on_delete=models.CASCADE)
    

    在这个例子中,Person 和 IDCard 之间建立了一对一关系,一个人只能有一个身份证号码,一个身份证号码也只能对应一个人。

  2. 一对多关系:在定义模型时,使用 ForeignKey 字段类型来定义一对多关系,例如:

    from django.db import models
    
    class Author(models.Model):
        name = models.CharField(max_length=50)
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        author = models.ForeignKey(Author, on_delete=models.CASCADE)
    

    在这个例子中,Author 和 Article 之间建立了一对多关系,一个作者可以写多篇文章,一篇文章只能有一个作者。

  3. 多对多关系:在定义模型时,使用 ManyToManyField 字段类型来定义多对多关系,例如:

    from django.db import models
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        tags = models.ManyToManyField('Tag')
    
    class Tag(models.Model):
        name = models.CharField(max_length=50)
    

    在这个例子中,Article 和 Tag 之间建立了多对多关系,一篇文章可以对应多个标签,一个标签也可以对应多篇文章。

在使用这些关系时,可以通过模型实例的属性或者方法来访问关联的对象,例如:

# 获取一对一关系的对象
person = idcard.person

# 获取一对多关系的对象列表
articles = author.article_set.all()

# 获取多对多关系的对象列表
tags = article.tags.all()

总之,在定义和使用模型关系时,需要根据具体的业务需求和数据特点来决定关系类型和选项,尽量使关系能够准确地反映数据的关联关系,并确保数据的完整性和一致性。在设计模型时,可以根据实际情况灵活选择关系类型和选项。

第六章:模型操作

使用Django的ORM进行数据库操作

创建数据:使用模型类的构造函数创建一个模型实例,并调用 save() 方法保存到数据库中,例如:

from myapp.models import MyModel

new_instance = MyModel(field1=value1, field2=value2)
new_instance.save()

读取数据:使用模型类的 objects 属性获取 QuerySet 对象,然后可以使用各种方法对数据进行过滤、排序等操作,例如:

from myapp.models import MyModel

all_instances = MyModel.objects.all()
filtered_instances = MyModel.objects.filter(field1=value1)
instance = MyModel.objects.get(id=1)

更新数据:获取到模型实例后,可以直接修改实例的属性并调用 save() 方法进行更新,例如:

instance = MyModel.objects.get(id=1)
instance.field1 = new_value1
instance.save()

删除数据:获取到模型实例后,调用 delete() 方法删除数据,例如:

instance = MyModel.objects.get(id=1)
instance.delete()

QuerySet的使用和常见查询方法

QuerySet 是 Django 中用来执行数据库查询的对象集合,可以通过模型类的 objects 属性获取。以下是一些常见的 QuerySet 方法:

  1. filter() :根据指定条件过滤数据,例如:

    filtered_instances = MyModel.objects.filter(field1=value1)
    
  2. exclude() :排除符合指定条件的数据,例如:

    excluded_instances = MyModel.objects.exclude(field1=value1)
    
  3. get() :根据指定条件获取单个对象,如果查询结果为空或者多于一个对象会抛出异常,例如:

    instance = MyModel.objects.get(id=1)
    
  4. all() :获取模型的所有对象,例如:

    all_instances = MyModel.objects.all()
    
  5. order_by() :根据指定字段对查询结果进行排序,例如:

    ordered_instances = MyModel.objects.order_by('field1')
    
  6. annotate() :对查询结果进行聚合操作,例如计算平均值、总和等,例如:

    from django.db.models import Avg
    average_value = MyModel.objects.all().annotate(avg_field1=Avg('field1')).first().avg_field1
    
  7. count() :获取查询结果的数量,例如:

    count = MyModel.objects.filter(field1=value1).count()
    

以上是一些常见的 QuerySet 方法,通过这些方法可以方便地对数据库进行增删改查操作。在实际应用中,可以根据具体的需求选择合适的方法来操作数据库。

第七章:模型继承与扩展

Django中的模型继承和扩展机制

Django中的模型继承和扩展机制可以帮助我们提高模型的复用性和灵活性,主要有以下几种方式:

  1. 抽象基类(Abstract Base Class) :抽象基类是一种不会在数据库中创建表的模型类,只能被其他模型类继承。通过抽象基类,可以将一些公共字段和方法抽象出来,避免在多个模型类中重复定义。例如:

    from django.db import models
    
    class BaseModel(models.Model):
        name = models.CharField(max_length=50)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        class Meta:
            abstract = True
    
    class MyModel(BaseModel):
        field1 = models.CharField(max_length=50)
        field2 = models.CharField(max_length=50)
    
  2. 多表继承(Multi-Table Inheritance) :多表继承是一种将一个模型类分成多个表的继承方式,每个子类对应一个表,子类可以访问父类的字段和方法。例如:

    from django.db import models
    
    class BaseModel(models.Model):
        name = models.CharField(max_length=50)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
    class MyModel(BaseModel):
        field1 = models.CharField(max_length=50)
    
    class MyModelChild(MyModel):
        field2 = models.CharField(max_length=50)
    
  3. 代理模型(Proxy Model) :代理模型是一种不会创建新表的模型类,可以用来修改模型类的默认行为或者添加新的方法。代理模型和原模型共享同一个表,但是代理模型的管理器和查询集可以自定义。例如:

    from django.db import models
    
    class MyModel(models.Model):
        field1 = models.CharField(max_length=50)
        field2 = models.CharField(max_length=50)
    
    class MyModelProxy(MyModel):
        class Meta:
            proxy = True
    
        def new_method(self):
            # add some new method
            pass
    
  4. Mixin模型(Mixin Model) :Mixin模型是一种不会被单独使用的模型类,只能被其他模型类继承。Mixin模型通常用于添加一些通用的方法或者字段,以便在多个模型类中复用。例如:

    from django.db import models
    
    class MyMixin(models.Model):
        field1 = models.CharField(max_length=50)
    
        def my_method(self):
            # add some new method
            pass
    
        class Meta:
            abstract = True
    
    class MyModel(MyMixin, models.Model):
        field2 = models.CharField(max_length=50)
    

如何利用这些机制来提高模型的复用性和灵活性

通过使用上述的模型继承和扩展机制,我们可以将一些公共的字段、方法和行为抽象出来,避免在多个模型类中重复定义。这样可以提高模型的复用性和灵活性,使得我们可以更加方便地管理和维护模型类。同时,这些机制也可以帮助我们更好地组织模型类的结构,使得代码更加清晰易懂,易于扩展和维护。

第八章:模型性能优化

Django模型层性能优化

在Django中,优化模型层的性能对于提升整体应用程序的性能至关重要。以下是一些常用的方法来优化Django模型层的性能:

  1. select_related:select_related方法用于在查询时一次性获取关联对象的数据,而不是每次访问关联对象时都执行一次数据库查询。这样可以减少数据库查询次数,提高性能。例如:

    queryset = MyModel.objects.select_related('related_model')
    
  2. prefetch_related:prefetch_related方法用于在查询时一次性获取关联对象的数据,但是与select_related
    不同的是,prefetch_related是通过执行额外的查询来获取关联对象的数据,然后将结果缓存起来以供后续使用。这对于一对多或多对多关系的查询特别有用。例如:

    queryset = MyModel.objects.prefetch_related('related_models')
    
  3. 只选择需要的字段: 在查询时,尽量只选择需要的字段,避免选择过多的字段导致数据传输量过大。可以使用values()
    values_list()方法来选择特定字段。

  4. 使用索引: 在数据库中为经常用于查询的字段添加索引,可以加快查询速度。可以在模型的Meta类中使用indexes属性来定义索引。

  5. 避免N+1查询问题: 当需要访问关联对象的多个实例时,避免使用循环来逐个查询,而应该使用select_related
    prefetch_related一次性获取所有需要的关联对象。

  6. 缓存数据: 对于一些数据不经常变化的查询结果,可以考虑使用缓存来减少数据库查询次数,提高性能。

避免常见的性能陷阱和瓶颈

  1. 循环查询数据库: 避免在循环中频繁查询数据库,应该尽量使用批量查询或者优化查询方式来减少数据库访问次数。
  2. 不合适的数据结构设计: 合理设计数据库表结构,避免过多的关联表和复杂的关联关系,以减少查询时的复杂度。
  3. 频繁的写操作: 避免频繁的写操作,尽量批量处理数据写入,减少数据库的压力。
  4. 未优化的查询: 使用Django提供的查询优化方法,如select_relatedprefetch_related等,避免不必要的查询操作。
  5. 忽略数据库性能调优: 定期检查数据库性能,优化数据库的配置和索引以提高查询效率。

通过合理使用上述优化方法和避免常见的性能陷阱和瓶颈,可以有效提高Django模型层的性能,使应用程序更加高效稳定。

第九章:模型安全

Django模型数据安全保护

保护Django模型数据的安全性是开发Web应用程序时非常重要的一环。以下是一些方法来保护Django模型数据的安全性:

  1. 防止SQL注入:

    • 使用Django的ORM来执行数据库查询,ORM会自动对输入参数进行转义,从而避免SQL注入攻击。
    • 避免使用原生SQL查询,尽量使用ORM提供的方法来构建查询。
  2. 防止XSS攻击:

    • 在模板中使用Django提供的过滤器和标签来转义用户输入的数据,例如{{ value|safe }}可以标记某个变量为安全的HTML内容。
    • 使用Django的escape函数对用户输入的数据进行转义,以防止恶意脚本注入。
  3. 数据验证:

    • 使用Django的表单验证功能,通过定义表单类并在视图中进行验证,可以有效验证用户输入数据的合法性。
    • 在模型中使用validators参数定义验证器来对字段进行验证,确保数据的完整性和正确性。
  4. 权限控制:

    • 使用Django的认证系统和权限系统,可以对用户进行认证和授权,限制其对数据的访问权限。
    • 在视图函数中使用@login_required装饰器来限制只有登录用户才能访问某些页面或执行某些操作。
    • 使用Django提供的permission_required装饰器来限制用户对特定资源的访问权限。
  5. 安全存储密码:

    • 使用Django提供的密码哈希算法来安全存储用户密码,确保用户密码在数据库中不以明文形式存储。
    • 使用Django的认证系统来处理用户密码验证,避免自行处理密码验证逻辑。
  6. HTTPS传输:

    • 在生产环境中使用HTTPS来加密数据传输,确保数据在传输过程中不被窃取或篡改。

通过以上方法,可以有效保护Django模型数据的安全性,防止常见的安全攻击,确保应用程序的数据安全和用户信息安全。

第十章:高级主题

高级模型层主题

在Django中,有许多高级的模型层主题可以帮助开发人员更好地定制和管理数据模型。以下是一些高级主题的介绍:

  1. 自定义模型管理器:

    • 可以通过自定义模型管理器来扩展模型的查询功能,例如定义自定义查询方法、过滤器等。
    • 通过创建自定义管理器类并在模型中指定objects = CustomManager()来替换默认的管理器。
  2. 信号处理:

    • 信号是Django中的一种机制,用于在模型的保存、删除等操作前后触发自定义的处理函数。
    • 可以使用信号处理来实现一些与模型操作相关的逻辑,如在用户注册时自动创建相关的数据。
  3. 数据迁移:

    • Django的ORM提供了数据迁移功能,可以帮助开发人员在数据库模式发生变化时轻松地同步数据库结构。
    • 通过运行python manage.py makemigrationspython manage.py migrate命令来生成和应用数据迁移。
  4. 使用内置功能和扩展解决复杂数据库需求:

    • Django提供了丰富的内置功能和扩展,如模型字段、关联、查询表达式等,可以用来解决复杂的数据库需求。
    • 可以使用Django的ORM来构建复杂的查询,利用ORM的链式调用和查询表达式来实现高级查询。
  5. 使用第三方库:

    • Django社区中有许多优秀的第三方库和扩展,可以帮助解决特定的数据库需求,如django-rest-framework、django-filter等。
    • 可以根据项目需求选择合适的第三方库,以提高开发效率和满足特定需求。

通过灵活运用以上高级模型层主题,开发人员可以更好地定制和管理数据模型,解决复杂的数据库需求,并提升开发效率和代码质量。

第十一章:案例分析

案例分析:在线电影平台

在线电影平台是一个复杂的数据库模型和ORM操作的典型案例,本节将通过分析该案例,深入讨论实际项目中遇到的挑战和解决方案。

需求分析

在线电影平台是一个电影信息查询和在线观看的平台,用户可以在平台上搜索电影、查看电影信息、在线观看电影等。在数据库模型设计上,需要考虑以下几个实体:用户、电影、电影分类、电影评论等。

数据库模型设计

  1. 用户(User):用户表包括用户ID、用户名、密码、电子邮件、注册时间等字段。
  2. 电影(Movie):电影表包括电影ID、电影名称、电影分类、电影海报、电影简介、电影时长、电影评分等字段。
  3. 电影分类(Category):电影分类表包括分类ID、分类名称、分类描述等字段。
  4. 电影评论(Comment):电影评论表包括评论ID、用户ID、电影ID、评论内容、评论时间等字段。

ORM操作

在实现ORM操作时,可以使用Django的ORM来构建查询和操作数据库。以下是一些常见的ORM操作:

  1. 查询电影列表:
movies = Movie.objects.all()
  1. 根据电影ID查询电影:
movie = Movie.objects.get(id=1)
  1. 查询电影分类:
categories = Category.objects.all()
  1. 查询用户评论:
comments = Comment.objects.filter(movie_id=1)
  1. 添加电影评论:
comment = Comment.objects.create(user_id=1, movie_id=1, content='Great movie!')
  1. 更新电影评分:
movie = Movie.objects.get(id=1)
movie.score = 9.5
movie.save()
  1. 删除电影:
movie = Movie.objects.get(id=1)
movie.delete()

挑战和解决方案

AD:首页 | 一个覆盖广泛主题工具的高效在线平台(amd794.com)

在实际项目中,可能会遇到一些挑战,如数据库性能问题、数据库规模问题等。以下是一些常见的挑战和解决方案:

  1. 数据库性能问题:

    • 可以使用Django的缓存系统来缓存查询结果,以减少对数据库的访问次数。
    • 可以使用数据库索引来优化数据库查询,提高数据库性能。
  2. 数据库规模问题:

    • 可以使用分库分表来解决数据库规模问题,将数据分布到多个数据库中,提高数据库的读写性能。
    • 可以使用数据库读写分离来解决数据库规模问题,将数据库读写分离到不同的数据库中,提高数据库的读写性能。
  3. 数据库安全问题:

    • 可以使用数据库加密来保护数据库中的敏感信息,防止数据泄露。
    • 可以使用数据库审计来记录数据库操作,监控数据库安全。

AD:专业搜索引擎
通过分析在线电影平台的案例,开发人员可以了解如何设计和实现复杂的数据库模型和ORM操作,以及如何解决实际项目中遇到的挑战和解决方案。

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

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

相关文章

Lucene从入门到精通

**************************************************************************************************************************************************************************** 1、概述 【1】入门:作用、有点与缺点 【2】应用:索引、搜索、fie…

最短路径(朴素)+堆排序+模拟堆

文章目录 Dijkstra求最短路 I堆排序模拟堆 Dijkstra求最短路 I 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。 输…

对命令模式的理解

目录 一、场景1、文本编辑器并不是一个好的例子,设备控制器才是2、设备控制器的demo 二、不用命令模式1、代码2、问题 三、使用命令模式1、代码2、当需求变化时2.1 新增代码2.2 优点 四、进一步思考1、省略对Command的建模可以吗?2、命令模式的价值 一、…

香港理工大学内地事务总监陆海天教授确认出席“边缘智能2024 - AI开发者峰会”并发表主题演讲

隨著AI技術的日新月異,我們正步入一個邊緣計算智能化與分布式AI相互融合的新紀元。這一變革不僅推動了分布式智能創新應用的飛速發展,還使得邊緣智能——這一結合邊緣計算和智能技術的新興領域,逐漸成為引領AI發展的重要力量。通過其分布式和…

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1)

从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1) 一、sentinel:概述 1、前言 – 服务熔断 Hystrix 的替换方案。 1)2018年底 Netflix 官方宣布 Hystrix 已经足够稳定,不再积极开发 Hys…

基于AT89C52单片机的智能热水器控制系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89242443?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤05 题 目 基于单片机的智能热水器系统 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成日期…

【Docker学习】docker version查看版本信息

就像很多应用一样,docker也使用version来查看版本信息。但因为docker包含有不少独立组件,version的作用范围会更广一些。 用法1: docker --version 描述: 输出安装的Docker CLI 的版本号。关于Docker CLI,请访问。 实操…

Ubuntu启动后进入GRUB故障-Minimal BASH like line editing is supported.

目录 1.问题描述 2.解决方案 2.1 临时性办法 2.2 工具永久性修复 总结 1.问题描述 PC安装Ubuntu系统第二天重启后提示GUN GRUB version 2.04,之前是WindowsOS装Ubuntu后无法进入图形界面。具体原因据网友提供线索据说是由于在Windows上进行更新/重装/修改了引…

Golang | Leetcode Golang题解之第66题加一

题目&#xff1a; 题解&#xff1a; func plusOne(digits []int) []int {n : len(digits)for i : n - 1; i > 0; i-- {if digits[i] ! 9 {digits[i]for j : i 1; j < n; j {digits[j] 0}return digits}}// digits 中所有的元素均为 9digits make([]int, n1)digits[0]…

Docker-Compose编排LNMP并部署WordPress

前言 随着云计算和容器化技术的快速发展&#xff0c;使用 Docker Compose 编排 LNMP 环境已经成为快速部署 Web 应用程序的一种流行方式。LNMP 环境由 Linux、Nginx、MySQL 和 PHP 组成&#xff0c;为运行 Web 应用提供了稳定的基础。本文将介绍如何通过 Docker Compose 编排 …

【深度学习】第一门课 神经网络和深度学习 Week 3 浅层神经网络

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题 2024/5/3 9:33 缘起&#xff1a;因为工作需要&#xff0c;编译服务器上都会安装Ubuntu20.04。 但是因为WINDOWS强悍的生态系统&#xff0c;偶尔还是有必须要用WINDOWS的时候&#xff0c;于是也安装了WIN10。 双系…

AJ-Report开源数据大屏 verification;swagger-ui RCE漏洞复现

0x01 产品简介 AJ-Report是一个完全开源的BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。多数据源支持,内置mysql、elasticsearch、kudu等多种驱动,支持自定义数据集省去数据接口开发,支持17+种大屏组件,不会开发,照着设计稿也可以制作大屏。三…

Linux进程——Linux下常见的进程状态

前言&#xff1a;在进程学习这一块&#xff0c;我们主要学习的就是PCB这个进程控制块&#xff0c;而PBC就是用来描述进程的结构体&#xff0c;而进程状态就是PCB结构体中的一个变量。 本篇主要内容&#xff1a; 操作系统中的进程状态Linux下的进程状态 在开始之前&#xff0c;我…

MLP手写数字识别(2)-模型构建、训练与识别(tensorflow)

查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())1.MNIST的数据集下载与预处理 import tensorflow as tf from keras.datasets import mnist from keras.utils import to_categori…

排序算法--直接选择排序

前提&#xff1a; 选择排序&#xff1a;选择排序(Selection sort)是一种比较简单的排序算法。它的算法思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。 话不多说&#xff0c;直接放图…

Xamarin.Android项目显示Properties

在 Visual Studio 2022 中&#xff0c;如果您需要调出“Properties”&#xff08;属性&#xff09;窗口&#xff0c;您可以使用以下几种方法&#xff1a; 快捷键&#xff1a; 您可以按 F4 快速打开当前选择项的“Properties”窗口。

postman中百度preview无法加载的解决方案

问题 在使用postman关联时&#xff0c;百度接口与天气接口已使用glb_city关联&#xff0c;但在百度接口发送请求时&#xff0c;发现preview无法加载 解决方案 1、进入百度 百度全球领先的中文搜索引擎、致力于让网民更便捷地获取信息&#xff0c;找到所求。百度超过千亿的中…

【云原生】Docker 实践(二):什么是 Docker 的镜像

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

在M1芯片安装鸿蒙闪退解决方法

在M1芯片安装鸿蒙闪退解决方法 前言下载鸿蒙系统安装完成后&#xff0c;在M1 Macos14上打开闪退解决办法接下来就是按照提示一步一步安装。 前言 重新安装macos系统后&#xff0c;再次下载鸿蒙开发软件&#xff0c;竟然发现打不开。 下载鸿蒙系统 下载地址&#xff1a;http…