Django ORM魔法:用Python代码召唤数据库之灵!
探索Django ORM的神奇世界,学习如何用Python代码代替复杂的SQL语句,召唤数据库之灵,让数据管理变得轻松又有趣。从基础概念到高级技巧,阿佑带你一步步成为Django ORM的魔法师,让你的应用开发速度飞起来!
文章目录
- 深入 Django 模型(Models)
- 1. ORM 基础和优势
- 1.1 ORM 概念
- 1.2 Django ORM 的工作原理
- 1.3 使用 ORM 的好处
- 2. 定义数据模型
- 2.1 创建模型类
- 2.2 模型类属性与字段
- 2.3 Meta 类与模型元数据
- 2.4 自定义模型方法
- 3. 模型字段类型和选项
- 3.1 常用字段类型介绍
- 3.1.1 字符串字段
- 3.1.2 数字字段
- 3.1.3 日期时间字段
- 3.1.4 关系字段等
- 3.2 字段选项与验证
- 3.3 索引与唯一约束
- 4. 数据库迁移管理
- 4.1 什么是数据库迁移
- 4.2 `makemigrations` 命令解析
- 4.3 `migrate` 命令操作
- 4.4 处理迁移中的冲突与回滚
- 4.5 自定义迁移操作
- 5. 结论
- 5.1 Django 模型最佳实践回顾
- 5.2 Django ORM 在实际项目中的威力
- 参考文献
深入 Django 模型(Models)
1. ORM 基础和优势
1.1 ORM 概念
想象一下,你是一个魔法师,手中有一根魔法棒,你只需挥一挥,就能让数据库里的数据按照你的意愿变化。在编程的世界里,ORM(Object-Relational Mapping)就像这根魔法棒,它让你能够用面向对象的方式来操作数据库,而不用写那些繁琐的SQL语句。
1.2 Django ORM 的工作原理
Django ORM 是 Django 框架中的核心组件之一,它将数据库表映射为Python类,将表中的行映射为类实例。这样,你就可以通过Python代码来创建、查询、更新和删除数据库中的数据,而不必直接与数据库打交道。
1.3 使用 ORM 的好处
使用 ORM 有以下几个好处:
- 代码简洁:ORM 让你用Python代码代替SQL,代码更加简洁易懂。
- 数据库无关性:ORM 抽象了数据库操作,让你的代码不依赖于特定的数据库。
- 安全性:ORM 可以防止SQL注入等安全问题,因为它会自动转义输入。
- 开发效率:使用 ORM 可以大幅提高开发效率,让你更快地构建应用。
现在,让我们来编织一个故事,让这些概念变得更加生动有趣。
从前,有一个名叫Django的小镇,镇上有一个神奇的图书馆,图书馆里有一个叫做ORM的魔法师。ORM魔法师有一种特殊的能力,他可以用魔法棒(ORM)来操纵图书馆里的藏书(数据库),而不需要亲自去翻阅每一本书(写SQL语句)。
有一天,镇上的居民们需要查找一些关于历史的书籍。如果换作以前,他们需要自己去书架上一本一本地查找,这既费时又费力。但是,有了ORM魔法师的帮助,他们只需要告诉ORM魔法师他们想要找的书的类型,ORM魔法师就能迅速地找到并展示给他们。
ORM魔法师的魔法棒还有一个特别之处,它能够保护图书馆的藏书不被损坏。因为魔法棒会自动转义那些可能会伤害到书籍的咒语(防止SQL注入)。这样,居民们就可以安心地使用图书馆,而不用担心会破坏这些珍贵的藏书。
随着时间的推移,ORM魔法师的名声越来越大,越来越多的人来到Django小镇,希望借助ORM魔法师的力量,快速地找到他们需要的书籍。ORM魔法师也乐于助人,他不断地提高自己的魔法技能,让更多的人能够享受到快速、安全、便捷的图书馆服务。
2. 定义数据模型
2.1 创建模型类
在Django小镇的图书馆里,ORM魔法师不仅能够快速找到书籍,还能帮助居民们创建新的藏书。这就像是在Django中创建模型类。每个模型类都代表了数据库中的一个表,而模型类的属性则对应表中的列。
想象一下,如果你想要添加一本关于编程的书籍到图书馆,你只需要告诉ORM魔法师这本书的标题、作者、出版年份等信息。ORM魔法师会用他的魔法棒挥一挥,一个新的模型类就诞生了,它包含了所有必要的信息,并且会自动映射到数据库中的一个新表。
2.2 模型类属性与字段
在Django的ORM魔法世界里,每个模型类都由一系列的字段组成,这些字段定义了模型可以存储的数据类型。就像图书馆里的每本书都有标题、作者和ISBN号一样,每个模型类也有它自己的字段来存储不同的数据。
- 字符串字段:用来存储文本信息,比如书名或作者名。
- 数字字段:用来存储数字,比如书籍的出版年份或价格。
- 日期时间字段:用来存储日期和时间,比如书籍的出版日期。
- 关系字段:用来定义模型之间的关系,比如一本书属于哪个作者,或者哪个图书馆拥有这本书。
2.3 Meta 类与模型元数据
在ORM魔法师的魔法世界中,还有一个叫做Meta
的神秘类。这个类允许你为模型添加一些特殊的指令,就像给图书馆的藏书加上一些特殊的标签,比如分类、索引或者排序方式。
通过Meta
类,你可以告诉ORM魔法师如何优化查询,如何设置表的名称,或者如何定义模型的顺序。这就像是在图书馆中,你可以告诉图书管理员如何根据主题、作者或者出版时间来排列书籍。
2.4 自定义模型方法
最后,每个模型类还可以有自己的魔法——自定义方法。这些方法就像是图书馆里的一些特殊服务,比如推荐系统,可以根据读者的喜好推荐书籍;或者是一个借阅记录功能,可以追踪谁借了哪本书。
通过自定义方法,你可以为模型添加特定的业务逻辑,使得你的应用更加智能和个性化。这就像是图书馆里的图书管理员,他们不仅管理书籍,还能提供阅读建议和帮助读者找到他们感兴趣的书籍。
在Django小镇的图书馆里,ORM魔法师用他的魔法棒创造了一个充满魔力的模型世界。居民们可以轻松地创建、管理和查询数据,就像在图书馆里轻松地找到他们想要的书籍一样。随着我们继续探索,你将看到ORM魔法师如何用他的魔法帮助小镇的居民解决更多的问题。
3. 模型字段类型和选项
3.1 常用字段类型介绍
在Django小镇的图书馆里,每本书都有它独特的属性,就像在Django模型中,每个字段都有其特定的类型。这些字段类型就像是图书馆的分类标签,帮助我们更好地组织和理解数据。
3.1.1 字符串字段
想象一下,当你走进图书馆,你会看到各种书籍的标题,这些标题就是字符串字段。在Django中,CharField
用于存储短文本,比如用户名或城市名。它还有一个max_length
参数,就像给书架上的标签设定一个最大长度,确保每本书的标题都不会太长。
from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100) # 书名,最大长度为100个字符
3.1.2 数字字段
图书馆里的书籍也有价格,这就是数字字段的用武之地。IntegerField
用于存储整数,比如书籍的定价或者库存数量。
price = models.IntegerField() # 书籍价格
3.1.3 日期时间字段
每本书都有出版日期,这就是DateTimeField
发挥作用的时候。它用来存储日期和时间,帮助我们追踪每本书的出版历程。
publish_date = models.DateTimeField() # 出版日期
3.1.4 关系字段等
在图书馆中,有些书是系列作品,它们之间有联系。在Django中,我们用关系字段来表示这种联系。ForeignKey
可以用来表示一个模型与另一个模型的关联,比如一本书属于一个特定的作者。
class Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE) # 书籍关联作者
3.2 字段选项与验证
在图书馆中,我们希望每本书的信息都是准确无误的。在Django中,我们可以通过字段选项和验证来确保数据的准确性。
- choices:有时候,我们希望某个字段只能有特定的几个选项,这时可以使用
choices
参数,就像给书架上的标签设定几种特定的颜色。
GENDER_CHOICES = [('M', 'Male'),('F', 'Female'),
]gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
- validators:我们还可以为字段添加验证器,确保输入的数据是有效的,就像图书管理员检查每本书的ISBN号是否正确。
from django.core.validators import MinValueValidatorage = models.IntegerField(validators=[MinValueValidator(18)]) # 年龄必须大于等于18
3.3 索引与唯一约束
图书馆的书籍需要快速被检索到,数据库中的索引就起到了这样的作用。在Django中,可以通过db_index=True
为字段添加索引,加快查询速度。
isbn = models.CharField(max_length=13, unique=True, db_index=True) # ISBN号唯一且建立索引
唯一约束unique=True
确保了每本书的ISBN号都是独一无二的,就像每本书在图书馆中的位置一样。
在Django小镇的图书馆里,ORM魔法师用他的魔法棒为每本书都打上了标签,确保了每本书都能被快速准确地找到。通过字段类型、选项和验证,ORM魔法师帮助图书馆维护了数据的准确性和完整性。而索引和唯一约束则让数据检索变得更加迅速。
随着我们继续深入探索,你将看到ORM魔法师如何用他的魔法帮助小镇的居民解决更多的问题。下一章节,我们将一起学习数据库迁移管理,看看ORM魔法师如何巧妙地处理数据库的变化。敬请期待!
4. 数据库迁移管理
4.1 什么是数据库迁移
在Django小镇的图书馆里,随着时间的推移,居民们的需求不断变化,图书馆也需要不断地调整和更新。同样,在Django的世界里,随着应用的发展,数据库结构也需要随之变化。这就是所谓的数据库迁移。数据库迁移是Django用来修改数据库结构的一种机制,它允许开发者以一种可控和可逆的方式更新数据库。
4.2 makemigrations
命令解析
当图书馆需要增加新的书架或者改变书架的布局时,ORM魔法师会使用他的魔法棒,执行makemigrations
命令。这个命令就像是一个规划师,它会根据模型的变化生成迁移文件,这些文件包含了所有必要的步骤来更新数据库。
python manage.py makemigrations
执行这个命令后,Django会检查你的模型定义,并与当前的数据库结构进行比较,然后创建一个新的迁移文件,这个文件包含了所有需要执行的更改。
4.3 migrate
命令操作
一旦迁移文件准备好了,ORM魔法师就会使用另一个强大的咒语——migrate
命令,来实际执行这些更改。
python manage.py migrate
这个命令会应用所有未应用的迁移,更新数据库结构,使其与模型定义保持一致。这个过程就像是图书馆管理员根据新的规划来调整书架的位置和布局。
4.4 处理迁移中的冲突与回滚
在图书馆的改造过程中,有时会出现一些计划之外的问题,比如两个书架的布局冲突了。在Django的迁移中,也可能会遇到类似的问题,这时就需要处理迁移冲突。
如果迁移过程中出现问题,可以使用migrate
命令的--fake
参数来模拟迁移的回滚。
python manage.py migrate app_name zero
这个命令会将指定应用的迁移状态回滚到初始状态,就像是撤销图书馆的改造计划,恢复到原来的样子。
4.5 自定义迁移操作
有时候,图书馆需要进行一些特殊的改造,这些改造超出了常规规划的范围。同样,在Django中,有时候我们需要执行一些自定义的迁移操作。
在迁移文件中,你可以定义operations
列表,来执行自定义的迁移操作。这就像是图书馆管理员根据特殊情况,进行一些特殊的调整。
from django.db import migrations, modelsclass Migration(migrations.Migration):dependencies = [('app_name', '0001_initial'),]operations = [migrations.RunPython(some_custom_function,reverse_code=some_custom_function_reverse,),]
在这个例子中,some_custom_function
和some_custom_function_reverse
是自定义的Python函数,用于执行和回滚迁移。
在Django小镇的图书馆里,ORM魔法师用他的魔法棒管理着图书馆的每一次变革。通过makemigrations
和migrate
命令,他确保了图书馆的书架和布局总是能够满足居民们的需求。即使遇到冲突和问题,ORM魔法师也能够巧妙地解决,保持图书馆的和谐与秩序。
随着我们继续深入探索,你将看到ORM魔法师如何用他的魔法帮助小镇的居民解决更多的问题。下一章节,我们将回顾Django模型的最佳实践,并展望Django ORM在实际项目中的威力。敬请期待!
5. 结论
5.1 Django 模型最佳实践回顾
随着我们对Django小镇图书馆的探索接近尾声,让我们回顾一下ORM魔法师在管理图书馆时遵循的最佳实践。
- 保持模型简洁:就像图书馆的每本书都应该有明确的分类和标签,每个模型也应该有清晰的职责和目的。
- 使用适当的字段类型:选择正确的字段类型,就像为每本书选择合适的书架,可以确保数据的准确性和效率。
- 利用关系字段:合理地使用关系字段,可以帮助我们构建复杂的数据结构,就像图书馆中的参考书籍可以引导读者发现更多相关书籍。
- 编写清晰的文档:为模型编写清晰的文档,就像图书馆的目录,可以帮助其他图书管理员(开发者)快速理解模型的用途和结构。
- 定期进行数据库迁移:及时应用数据库迁移,确保数据库结构与模型定义保持同步,就像定期整理图书馆,保持其有序。
5.2 Django ORM 在实际项目中的威力
Django ORM不仅仅是一个工具,它是一种哲学,一种让开发者能够以更高层次的思维来处理数据的方法。在实际项目中,Django ORM的威力体现在以下几个方面:
- 提高开发速度:通过减少编写和维护SQL语句的工作量,Django ORM让开发者能够更快地构建应用。
- 增强代码可读性:使用Python代码代替SQL,使得代码更加易于理解和维护。
- 数据库无关性:Django ORM的抽象层让应用能够更容易地在不同的数据库之间迁移。
- 数据完整性和安全性:通过自动转义输入和提供数据验证机制,Django ORM帮助保护应用免受SQL注入等安全威胁。
让我们通过一个简单的示例来展示Django ORM在实际项目中的威力。假设我们正在开发一个博客应用,我们需要创建一个模型来存储文章:
from django.db import modelsclass Post(models.Model):title = models.CharField(max_length=200)content = models.TextField()published_date = models.DateTimeField()def __str__(self):return self.title
在这个模型中,我们定义了三个字段:标题、内容和发布日期。通过这个模型,我们可以轻松地执行以下操作:
- 创建新文章:
Post.objects.create(title='Hello World', content='This is my first post.', published_date=datetime.now())
- 查询所有已发布的文章:
published_posts = Post.objects.filter(published_date__lte=datetime.now())
- 更新文章内容:
post = Post.objects.get(id=1)
post.content = 'Updated content.'
post.save()
- 删除文章:
post.delete()
通过这些简单的操作,我们可以看到Django ORM如何简化数据库交互,提高开发效率。
随着我们的故事结束,我们可以看到Django ORM不仅仅是一个技术工具,它是一种艺术,一种让数据管理和应用开发变得更加优雅和高效的艺术。ORM魔法师用他的魔法棒,为Django小镇的图书馆带来了秩序和活力,也为我们的项目带来了无限的可能性。
在未来的开发旅程中,无论你是图书馆的图书管理员还是Django的开发者,都请记住这些最佳实践,让ORM魔法师的魔法在你的项目中绽放光彩。
参考文献
-
Django官方文档:模型 - 这是Django框架的官方文档部分,详细介绍了如何使用Django的ORM来定义和管理数据库模型。它包括了所有你需要了解的基础知识,以及高级特性和最佳实践。
- Django官方文档:模型
-
两篇Django ORM高级技巧文章 - 这些文章提供了一些Django ORM的高级技巧和最佳实践,可以帮助开发者更有效地使用Django ORM,并解决一些常见的问题。
- Django ORM高级技巧
- 更多Django ORM高级技巧
-
ORM设计模式与性能优化 - 这篇文章探讨了如何设计高效的ORM模型,以及如何优化ORM的性能,确保应用在处理大量数据时依然能够保持良好的性能。
- ORM设计模式与性能优化
相关文章:

Django ORM魔法:用Python代码召唤数据库之灵!
探索Django ORM的神奇世界,学习如何用Python代码代替复杂的SQL语句,召唤数据库之灵,让数据管理变得轻松又有趣。从基础概念到高级技巧,阿佑带你一步步成为Django ORM的魔法师,让你的应用开发速度飞起来! 文…...

JetBrains Mono字体下载及安装
百度云字体下载 提取码:zida 1.mac 安装 选择文件夹中的所有字体文件,然后双击它们。点击“安装字体”按钮。 2.windows 安装 选择文件夹中的字体文件,右键单击其中任何一个,然后从菜单中选择“安装”。 3.linux 安装 将字体…...

【OS】AUTOSAR OS系统调用产生Trap的过程详解
目录 前言 正文 1.Os_Hal_Trap使用示例 2. Os_Hal_Trap的定义 3. syscall详解详解...

Java中的异常处理机制
在Java中,异常处理是一种重要的编程机制,用于处理程序运行时可能出现的错误情况。它提供了一种结构化的方式来处理异常情况,使程序能够更健壮、更易于维护。下面将从技术难点、面试官关注点、回答吸引力和代码举例四个方面来详细描述Java中的…...

什么是PLAB?
接上文PLAB---》 可以看到和TLAB很像,PLAB即 Promotion Local Allocation Buffers。用在年轻代对象晋升到老年代时。 在多线程并行执行YGC时,可能有很多对象需要晋升到老年代,此时老年代的指针就"热"起来了,于是搞了个…...

复试不考机试,初试300分以上,上岸稳了?东北林业大学计算机考研考情分析!
东北林业大学(Northeast Forestry University),简称东北林大(NEFU),位于黑龙江省哈尔滨市,是一所以林科为优势、林业工程为特色的中华人民共和国教育部直属高校,由教育部、国家林业局…...

【30天精通Prometheus:一站式监控实战指南】第12天:windows_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
亲爱的读者们👋 欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀 Prometheus是云原生和DevOps的…...

微信小程序的事件绑定方式
微信小程序的事件绑定方式主要包括以下几种,每种方式都有其特定的用法和特性: 基础绑定方式: bind:这是最基础的绑定方式,用于绑定事件处理函数。例如,bindtap用于绑定点击事件。当组件触发事件时…...

AR和AP重分类(Regroup)[FAGLF101/OBBU/OBBV]
一、为什么AR和AP科目需要重分类 1.1 执行操作的前提(重要) 存在AR的当月总余额在贷方(客户贷项凭证、预收账款等)或AP的当月总余额在借方(供应商贷项凭证、预收账款等),这种情况下无法真实的反映出资产和负债情况&…...

进程——linux
目录 冯诺依曼体系结构(计算机组成原理与体系结构) 关于冯诺依曼,必须强调几点: 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 承上启下 一、进程 基本概念…...

关于如何通过APlayer+MetingJS为自己的wordpress博客网页添加网易音乐播放器(无需插件)
本文转自博主的个人博客:https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接:点我访问 序言:最近在网上冲浪,发现大家的博客大部分都有一个音乐播放器能够播放音乐,随机我也开始寻找解决方法。可是找来找去我…...

架构师如何以打游戏的心态做开发?
为什么打游戏可以很好玩,能够自发学习,从青铜到黄金很简单。换个角度思考🤔,以打游戏的心态如何进行架构开发,可以采用以下策略: 设定目标和里程碑: 就像游戏中的任务和关卡一样,为…...

【WP|6】WordPress 主题开发详解
WordPress主题开发是打造独特、功能强大的网站的重要途径。无论是创建全新的主题还是对现有主题进行自定义,掌握主题开发技能都是非常重要的。本文将详细讲解 WordPress 主题开发的基本步骤、文件结构、模板层次以及一些高级技巧,帮助你从零开始创建一个…...

Kivy.garden.NavigationDrawer 后续学习
如百词斩部分代码 MRWord\pages\infopage\info.kv <InfoPage>:anim_type: slide_above_simpleid: main_winbox_button_anchor: box_button_anchor.__self__three_labels_box: three_labels_box.__self__box_phonetic: box_phonetic.__self__BoxLayout:BoxLayout:id: ma…...

【CVE-2021-3156】——漏洞复现、原理分析以及漏洞修复
文章目录 前言1、漏洞概述2、漏洞复现2.1、漏洞复现测试环境2.2、漏洞复现具体步骤 3、漏洞原理3.1、前置知识3.1.1、sudo3.1.2、sudoedit3.1.3、转义字符 3.2、漏洞分析 4、漏洞修复5、参考文献总结 前言 2021年01月27日,RedHat官方发布了Sudo缓冲区/栈溢出漏洞的风…...

Github 2024-05-31 Java开源项目日报 Top10
根据Github Trendings的统计,今日(2024-05-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10TypeScript项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star数量:1…...

【上海大学计算机组成原理实验报告】六、内存系统实验
一、实验目的 学习内存访问机制。理解代码和数据的分区存放原理和技术。 二、实验原理 根据实验指导书的相关内容,地址寄存器MAR用来存放要进行读或写的存储器EM的地址。其内容经数据总线DBUS写入,因此必须在数据总线上具有数据后,配合MAR允…...

C++:细谈Sleep和_sleep
ZINCFFO的提醒 还记得上上上上上上上上上上上上上上上上上上(上的个数是真实的)篇文章吗? 随机应变——Sleep()和_sleep() 但在ZINCFFO的C怪谈-02中: 我不喜欢Sleep...... 奤?媜煞鷥! 整活!…...

CORS前端:深度解析跨域资源共享机制及其前端应用
CORS前端:深度解析跨域资源共享机制及其前端应用 在前端开发领域,CORS(跨源资源共享)是一个不可或缺的概念。它允许网页应用在不同的源(域、协议或端口)之间进行资源请求和共享,从而打破了同源…...

React@16.x(15)PureComponent 和 memo
目录 1,什么是 PureComponent2,什么是 memo3,举例3.2,优化13.1,优化2-函数位置 4,注意点4.1,为了提升效率,应该尽量使用 PureComponent4.2,不要直接改变之前的状态&#…...

[C++11/14新特性] tuple元组介绍
C11 标准新引入了一种类模板,命名为 tuple(中文可直译为元组)。tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛,例如当需要存储多个不同类型的元素时,可以使用…...

小熊家务帮day8-day9 客户管理模块2 (用户定位,地址簿,实名认证,银行卡信息上传等功能)
客户管理模块 0.用户定位功能0.1 需求0.2 接口分析0.3 接口开发Controller层开发Service层开发 1.我的地址簿功能1.1 需求1.2 数据库设计1.3 新增地址簿1.3.1 接口设计1.3.2 接口开发Controller层开发Service层开发测试功能 1.4 地址簿查询1.4.1 接口设计1.4.2 接口开发Control…...

amis 事件动作 和 行为按钮 常用用法
行为按钮 action (仅是对click事件的处理) actionType:这是 action 最核心的配置,来指定该 action 的作用类型,支持:ajax、link、url、drawer、dialog、confirm、cancel、prev、next、copy、close。 Butt…...

4K高刷显示器 - 蚂蚁电竞ANT27VU
可以毫不夸张地说,每一局游戏最终能够取得胜利,实际上都与一套极为优秀的电竞 PC 有着紧密的关联,因为其能够提供强大的性能支持与流畅的体验。同样的道理,一套优秀的电竞 PC 若想发挥出最佳的效果,那也都离不开一台能…...

图解支付系统的渠道路由设计
大家好,我是隐墨星辰,今天和大家聊聊渠道路由设计。 这篇文章主要讲清楚:渠道路由是什么,为什么需要渠道路由,渠道路由的几种形态,一个简洁而实用的基于规则的渠道路由设计。 注:有些公司称渠…...

Leecode---347:输出前k个高频元素(使用unordered_map)
题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 思路: 三步: 1、用map来记录每个元素出现的次数 2、按map中的值大小排序,先让其有序,再逆…...

k8s ceph(静态pvc)
1.在 Kubernetes 节点上安装ceph-common 包。这个包包含了连接到 Ceph 集群所需的工具和库。可以使用以下命令在每个节点上安装: sudo apt-get install ceph-common2.在 Kubernetes 中创建一个 Secret 对象,用于存储连接到 Ceph 集群所需的密钥和配置信息…...

Qt QScript 之 C++/JavaScript相互调用
文章目录 Qt Script什么是ECMAScriptQt 中JavaScriptclass 详解Basic UsageQObject对脚本引擎可用使用信号槽connect 三种模式访问属性, 子对象使c++对象可用于用Qt Script编写的脚本C++ 类成员函数可用于脚本C++ 类属性可用于脚本对脚本中的c++对象信号的反应函数对象和本机函…...

可能会引起空指针
PreparedStatement preparedStatement null; preparedStatement conn.prepareStatement(sql); 如果直接下面这个可能会赋值给空指针 因为要在try{}和catch{}里面都用,所以要定义在try外面为null //如果只是测试,可以PreparedStatement preparedStatement conn.prepareSta…...

Linux input输入子系统
Linux input 更多内容可以查看我的github Linux输入子系统框架 Linux输入子系统由驱动层、核心层、事件处理层三部分组成。 驱动层:输入设备的具体驱动程序,负责与具体的硬件设备进行交互,并将底层的硬件输入转化为统一的事件形式ÿ…...