「异步魔法:Python数据库交互的革命」(二)

哈喽,我是阿佑,上篇文章带领了大家跨入的异步魔法的大门——Python数据库交互,一场魔法与技术的奇幻之旅! 从基础概念到DB-API,再到ORM的高级魔法,我们一步步揭开了数据库操作的神秘面纱。SQLAlchemy和Django ORM让我们的数据库操作变得强大而灵活。现在,让我们迈向异步编程的新世界,探索如何同时施展多个咒语而不需等待,让数据库操作快如闪电。
准备好了吗?加入我们,一起开启这段充满挑战和乐趣的魔法冒险吧!

文章目录

    • 6. 异步数据库交互
      • 6.1 异步编程基础
        • asyncio与async/await
      • 6.2 Async SQLAlchemy与Tortoise-ORM
        • 异步数据库引擎配置
        • 异步查询与数据处理
    • 7. 性能优化与最佳实践
      • 7.1 连接池管理
        • 提升数据库访问效率
      • 7.2 查询优化策略
        • 索引使用与查询优化
        • 避免N+1查询问题
      • 7.3 安全性考虑
        • 防止SQL注入与数据泄露
    • 8. 魔法实践:构建一个简单的博客系统
      • 系统需求
      • 环境准备
      • 创建Django项目
      • 数据模型设计
      • 数据库迁移
      • 后台管理界面
      • 用户认证
      • 创建超级用户
      • 视图和URL配置
      • 模板创建
      • 评论功能实现
      • 后续建议
    • 9. 案例分析:电子商务平台的数据库设计
      • 电子商务平台的核心组件
      • 数据库设计原则
      • 数据模型设计
        • 用户账户模型
        • 商品目录模型
        • 购物车模型
        • 订单管理模型
        • 支付系统模型
        • 物流跟踪模型
      • 性能优化策略
      • 安全性设计
      • 实践案例
    • 8. 结论
      • Python数据库交互技术总结
        • 回顾我们的旅程
      • 未来趋势与持续学习方向
        • 持续学习的重要性
        • 结束语

在这里插入图片描述

6. 异步数据库交互

6.1 异步编程基础

嘿,魔法师们,准备好了吗?我们即将进入Python的异步编程世界,这就像是学习如何同时施展多个咒语,而不需要等待一个咒语完成才能开始下一个。

asyncio与async/await

在Python中,asyncio库是异步编程的核心,它就像是一个魔法时钟,让我们的程序能够在等待某个咒语完成时,继续进行其他任务。而asyncawait关键字,就像是我们的魔法助手,帮助我们管理这些异步任务。

import asyncio# 定义一个异步咒语
async def cast_spell(spell_name):print(f"开始施展 {spell_name}")await asyncio.sleep(1)  # 模拟咒语施展时间print(f"{spell_name} 成功!")# 同时施展多个咒语
async def cast_spells():await asyncio.gather(cast_spell("Expelliarmus"),cast_spell("Expecto Patronum"),cast_spell("Alohomora"))# 启动魔法时钟
asyncio.run(cast_spells())

6.2 Async SQLAlchemy与Tortoise-ORM

异步数据库引擎配置

现在,让我们看看如何将异步魔法带入数据库操作。Async SQLAlchemyTortoise-ORM是两个支持异步操作的ORM库,它们让我们可以异步地与数据库交互。

首先,让我们看看如何配置Async SQLAlchemy

from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.orm import sessionmaker# 创建异步数据库引擎
engine = create_async_engine("sqlite+aiosqlite:///./my_magic_library.db")# 创建异步Session类
AsyncSession = sessionmaker(engine, class_=AsyncIOSession)
async_session = AsyncSession()
异步查询与数据处理

使用Async SQLAlchemy,我们可以异步地执行数据库查询和操作:

# 定义一个异步模型
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import selectasync def fetch_spells(session: AsyncSession):# 异步查询咒语async with session.begin():spells = await session.execute(select(Spell))result = spells.fetchall()for spell in result:print(spell)# 运行异步数据库操作
async def main():async with AsyncSession(engine) as session:await fetch_spells(session)# 启动异步魔法
asyncio.run(main())

Tortoise-ORM则是另一种选择,它提供了一个更简洁的API来处理异步数据库操作:

import tortoise# 定义一个Tortoise模型
class Spell(tortoise.Model):name = tortoise.Field(max_length=255)description = tortoise.Field()# 定义模型的元数据class Meta:table = "spells"# 配置异步数据库连接
tortoise.init(db_url='sqlite://db.sqlite3',modules={'models': ['__main__']}
)# 异步生成数据库模型
await tortoise.generate_schemas()# 异步查询
async def fetch_spells():for spell in await Spell.all():print(spell.name, spell.description)# 运行异步查询
await fetch_spells()

通过这一章节,我们探索了异步编程的基础知识,以及如何使用Async SQLAlchemyTortoise-ORM进行异步数据库交互。这就像是学会了如何同时施展多个咒语,大大提高了我们的魔法效率。下一章,我们将讨论性能优化与最佳实践,确保我们的魔法既快速又高效。准备好了吗?让我们继续前进,成为更高级的魔法师!

7. 性能优化与最佳实践

7.1 连接池管理

嘿,魔法师们!今天我们要聊的是性能优化,这就像是给你的魔法棒升级,让它施展咒语更快、更高效。

提升数据库访问效率

想象一下,你的魔法图书馆有很多访客,如果每次有人来都要重新开门,那会是多么低效!这就是为什么我们需要连接池——它可以保持一些“门”开着,让访客(数据库查询)可以快速进出。

在SQLAlchemy中,你可以这样设置连接池:

from sqlalchemy import create_engine# 创建一个带有连接池的引擎
engine = create_engine('postgresql://user:password@localhost/dbname', pool_size=10, max_overflow=20)

这段代码创建了一个连接池,最多可以有10个连接,如果需求超过这个数量,连接池会创建更多的连接,最多到20个。

7.2 查询优化策略

索引使用与查询优化

在数据库中,索引就像是图书馆的目录,它可以帮助我们快速找到所需的书籍。在数据库中添加索引可以显著提高查询速度。

from sqlalchemy import create_engine, Column, Integer, String, Index
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class Spell(Base):__tablename__ = 'spells'id = Column(Integer, primary_key=True)name = Column(String)# 添加索引到name字段Index('idx_name', name)

在这个例子中,我们在name字段上创建了一个索引,这样当我们根据咒语名称进行查询时,数据库可以更快地定位到记录。

避免N+1查询问题

在使用ORM时,很容易遇到N+1查询问题,这会严重影响性能。想象一下,如果你每次查询一个魔法师和他的咒语时,都要分别查询魔法师和咒语,那将是多么低效!

# 错误的查询方式,会导致N+1问题
wizards = session.query(Wizard).all()
for wizard in wizards:print(wizard.name)for spell in wizard.spells:print(f" - {spell.name}")# 正确的查询方式,一次性获取所有数据
wizards_with_spells = session.query(Wizard).options(joinedload(Wizard.spells)).all()
for wizard in wizards_with_spells:print(wizard.name)for spell in wizard.spells:print(f" - {spell.name}")

7.3 安全性考虑

防止SQL注入与数据泄露

安全是我们施展魔法时必须考虑的重要方面。SQL注入就像是黑魔法师潜入你的图书馆,可能会造成严重破坏。

使用ORM时,通常可以避免SQL注入,因为它们会自动处理参数化查询。但如果你直接写SQL语句,一定要小心:

# 错误的查询方式,可能导致SQL注入
spell_name = "Expelliarmus'; DROP TABLE spells; --"
cursor.execute("SELECT * FROM spells WHERE name = '%s'", (spell_name,))# 正确的查询方式,使用参数化查询
spell_name = "Expelliarmus"
cursor.execute("SELECT * FROM spells WHERE name = :spell_name", {'spell_name': spell_name})

这段代码展示了如何使用参数化查询来防止SQL注入。


通过这一章,我们学习了如何通过连接池管理、查询优化策略和安全性考虑来优化我们的数据库性能。这就像是给我们的魔法装备升级,让它们更加强大和安全。现在,我们已经准备好进入最后一章,总结我们的学习成果,并展望未来的学习方向。准备好了吗?让我们继续前进,成为更高级的魔法师!
在这里插入图片描述

8. 魔法实践:构建一个简单的博客系统

在本节中,阿佑将带着大伙们一块深入实践,从头开始构建一个简单的博客系统。我们将使用Python的Django框架,因为它提供了ORM系统来简化数据库操作,同时也有强大的后台管理界面。我们的系统将包括文章的创建、编辑、发布以及评论功能。

系统需求

在开始之前,我们需要明确系统的基本需求:

  1. 用户认证:用户可以注册、登录和登出。
  2. 文章管理:用户可以创建、编辑和删除自己的文章。
  3. 评论系统:用户可以对文章发表评论。
  4. 文章展示:所有用户都可以浏览文章列表和文章详情。

环境准备

首先,确保你的开发环境中安装了Python和Django。可以通过以下命令安装Django:

pip install django

创建Django项目

接下来,创建一个新的Django项目和一个应用:

django-admin startproject blog
cd blog
python manage.py startapp posts

数据模型设计

posts/models.py中,定义我们的数据模型:

from django.db import models
from django.contrib.auth.models import Userclass Post(models.Model):title = models.CharField(max_length=200)content = models.TextField()author = models.ForeignKey(User, on_delete=models.CASCADE)published_date = models.DateTimeField(auto_now_add=True)def __str__(self):return self.titleclass Comment(models.Model):post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')author = models.CharField(max_length=100)content = models.TextField()created_date = models.DateTimeField(auto_now_add=True)def __str__(self):return f"Comment by {self.author} on {self.post.title}"

数据库迁移

创建好模型后,需要进行数据库迁移:

python manage.py makemigrations
python manage.py migrate

后台管理界面

为了让用户能够通过网页管理文章和评论,我们需要注册模型到Django的后台:

# 在posts/admin.py中from django.contrib import admin
from .models import Post, Commentadmin.site.register(Post)
admin.site.register(Comment)

用户认证

Django内置了用户认证系统,我们可以在blog/settings.py中配置一些设置:

# 添加'django.contrib.auth'到INSTALLED_APPSINSTALLED_APPS = [# ...'django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.admin','posts',  # 我们的应用
]# 设置LOGIN_REDIRECT_URL和LOGOUT_REDIRECT_URLLOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

创建超级用户

创建一个超级用户,用于登录后台管理系统:

python manage.py createsuperuser

视图和URL配置

posts/views.py中,创建文章列表和详情的视图:

from django.shortcuts import render, get_object_or_404
from .models import Postdef post_list(request):posts = Post.objects.all()return render(request, 'posts/post_list.html', {'posts': posts})def post_detail(request, pk):post = get_object_or_404(Post, pk=pk)return render(request, 'posts/post_detail.html', {'post': post})

然后,在blog/urls.py中配置URL:

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('posts.urls')),  # 包含posts应用的URL
]

posts/urls.py中,创建应用的URL:

from django.urls import path
from . import viewsurlpatterns = [path('', views.post_list, name='post_list'),path('post/<int:pk>/', views.post_detail, name='post_detail'),
]

模板创建

创建模板文件posts/post_list.htmlposts/post_detail.html来展示文章列表和详情。

评论功能实现

posts/views.py中,添加评论的视图:

from django.http import HttpResponseRedirect
from .models import Commentdef add_comment_to_post(request, pk):post = get_object_or_404(Post, pk=pk)if request.method == 'POST':content = request.POST.get('content')Comment.objects.create(post=post, author=request.user, content=content)return HttpResponseRedirect(post.get_absolute_url())

更新post_detail.html模板,添加评论表单。

后续建议

使用Bootstrap或其他CSS框架来美化界面。

启动Django的开发服务器,测试系统的所有功能:

python manage.py runserver

最后,当你在开发环境中测试无误后,可以考虑将博客系统部署到生产环境。


通过本节的实践,你已经了解了如何使用Django构建一个完整的博客系统。这包括了用户认证、文章管理、评论系统等核心功能。这个系统可以作为一个起点,你可以根据需要添加更多功能,比如文章分类、标签、搜索功能等。继续探索和学习,你的Python魔法将越来越强大!

9. 案例分析:电子商务平台的数据库设计

阿佑将和大家一起进行一个深入的案例分析,探索一个电子商务平台的数据库设计。电子商务平台是一个复杂的系统,涉及用户管理、商品目录、订单处理、支付系统、物流跟踪等多个方面。我们将重点讨论数据库设计的最佳实践,以及如何确保系统的可扩展性、性能和安全性。

电子商务平台的核心组件

  1. 用户账户管理:存储用户信息,包括个人资料、地址簿、订单历史等。
  2. 商品目录:展示商品信息,包括商品描述、图片、价格、库存等。
  3. 购物车:管理用户的购物车,包括商品的添加、删除和更新。
  4. 订单管理:处理订单的创建、支付、发货和状态跟踪。
  5. 支付系统:集成第三方支付服务,处理支付事务。
  6. 物流跟踪:与物流服务提供商集成,跟踪订单配送状态。
  7. 安全性:确保用户数据和交易的安全性。

数据库设计原则

在设计电子商务平台的数据库时,应遵循以下原则:

  1. 规范化:通过数据库规范化减少数据冗余,保证数据一致性。
  2. 可扩展性:设计灵活的数据库架构,以适应业务增长和变化。
  3. 性能优化:通过索引、查询优化和缓存策略提高数据库性能。
  4. 安全性:实施安全措施,如数据加密、访问控制和SQL注入防护。

数据模型设计

用户账户模型
class User(models.Model):username = models.CharField(max_length=50, unique=True)email = models.EmailField(unique=True)password = models.CharField(max_length=50)first_name = models.CharField(max_length=50)last_name = models.CharField(max_length=50)address = models.ForeignKey(Address, on_delete=models.SET_NULL, null=True)# 其他用户相关信息

在这里插入图片描述

商品目录模型
class Product(models.Model):name = models.CharField(max_length=100)description = models.TextField()price = models.DecimalField(max_digits=10, decimal_places=2)stock_quantity = models.IntegerField()image = models.ImageField(upload_to='products/')# 其他商品相关信息
购物车模型
class Cart(models.Model):user = models.ForeignKey(User, on_delete=models.CASCADE)products = models.ManyToManyField(Product, through='CartItem')# 购物车相关信息
订单管理模型
class Order(models.Model):user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)order_date = models.DateTimeField(auto_now_add=True)status = models.CharField(max_length=50)total_price = models.DecimalField(max_digits=10, decimal_places=2)# 订单相关信息
支付系统模型
class Payment(models.Model):order = models.ForeignKey(Order, on_delete=models.CASCADE)payment_date = models.DateTimeField(auto_now_add=True)amount = models.DecimalField(max_digits=10, decimal_places=2)transaction_id = models.CharField(max_length=100)# 支付相关信息
物流跟踪模型
class Shipment(models.Model):order = models.OneToOneField(Order, on_delete=models.CASCADE)tracking_number = models.CharField(max_length=50)carrier = models.CharField(max_length=50)status = models.CharField(max_length=50)# 物流相关信息

性能优化策略

  1. 索引优化:为常用的查询字段添加索引,如商品的pricestock_quantity,用户的email等。
  2. 查询优化:避免复杂的多表关联查询,使用选择性的查询字段,减少数据加载。
  3. 缓存策略:使用缓存存储频繁访问的数据,如商品目录、热门商品等。
  4. 负载均衡:在高流量时,使用数据库集群和负载均衡技术分散请求。

安全性设计

  1. 数据加密:对敏感信息如用户密码、支付信息进行加密存储。
  2. 访问控制:实施基于角色的访问控制,确保用户只能访问对应的数据。
  3. SQL注入防护:使用参数化查询,避免SQL注入攻击。
  4. 安全审计:定期进行安全审计,检查潜在的安全漏洞。

实践案例

假设我们需要为一个电子商务平台添加一个新功能:推荐系统。推荐系统可以根据用户的购买历史和浏览行为,推荐相关的商品。

  1. 数据收集:收集用户的购买历史、浏览记录、评分等数据。
  2. 数据分析:使用数据分析工具,如Python的Pandas库,分析用户行为模式。
  3. 推荐算法:应用推荐算法,如协同过滤、内容推荐等,生成推荐列表。
  4. 系统集成:将推荐系统集成到电子商务平台的前端,提供个性化推荐。

通过本节的案例分析,我们深入了解了一个电子商务平台的数据库设计。从数据模型设计到性能优化,再到安全性设计,每一步都至关重要。在实际开发中,需要根据业务需求和系统特点,不断调整和优化数据库设计。同时,随着业务的发展,可能还需要引入新技术和架构,如NoSQL数据库、大数据平台等,以满足不断变化的需求。希望本节的案例分析能够为你的数据库设计提供一些有价值的参考和启示。

8. 结论

Python数据库交互技术总结

嘿,亲爱的魔法师们,我们这趟神奇的数据库之旅即将到达终点。在这一路上,我们学到了很多东西,从基础的DB-API到强大的ORM框架,再到异步编程的魔法,我们的能力已经大大提升。

回顾我们的旅程
  • DB-API:我们学会了如何使用Python标准库与数据库进行基础的交互,就像是学习基础的魔法咒语。
  • SQLAlchemy:我们探索了ORM的奥秘,它让我们能够用Python类来映射数据库表,就像是用高级魔法来管理我们的魔法图书馆。
  • Django ORM:我们见识了Django的强大,它提供了一个简洁的API来处理数据库操作,让一切变得简单而高效。
  • 异步数据库交互:我们学习了如何使用asyncio和异步ORM库,让我们的数据库操作更加快速和非阻塞。
  • 性能优化:我们讨论了连接池、查询优化和安全性,确保我们的数据库操作既快速又安全。

未来趋势与持续学习方向

持续学习的重要性

魔法世界是不断变化的,新的魔法和咒语总是在出现。同样,技术领域也在不断进步,新的工具和框架层出不穷。作为一个魔法师,我们需要不断学习和适应。

  • 学习新的数据库技术:比如NoSQL数据库、NewSQL数据库,甚至是区块链数据库。
  • 掌握更多ORM框架:除了SQLAlchemy和Django ORM,还有许多其他的ORM框架等待我们去探索。
  • 深入异步编程:随着异步编程在Python中的日益普及,深入学习和实践异步编程将是一个重要的方向。
  • 关注安全性:随着数据泄露和网络攻击的增加,学习如何保护我们的数据库和应用程序变得尤为重要。
结束语

亲爱的魔法师们,我们的旅程虽然结束了,但你们的魔法之路才刚刚开始。记住,每一次数据库查询都像是施展一个咒语,每一次性能优化都像是给你的魔法棒升级。保持好奇心,不断探索和学习,你们将成为最伟大的魔法师。


就这样,我们的Python数据库交互之旅告一段落。希望你们喜欢这段旅程,也希望你们从中学到了很多。如果你有任何问题,或者想要继续探索魔法世界,随时欢迎回来。祝你们的魔法之路充满乐趣和成功!再见!🧙‍♂️✨

我是阿佑,一个专注于把晦涩的技术讲得有趣的中二青年,欢迎持续关注~

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

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

相关文章

【2024最新华为OD-C卷试题汇总】披萨大作战 (100分) - 支持在线评测+三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 前…

自动化测试实践:揭秘WebSocket在接口测试中的应用

如何写接口自动化&#xff1f;这个问题&#xff0c;但凡涉足过自动化测试的人员都能娓娓道来。Requests、urlib、jmeter、curl等等&#xff0c;不在话下。那么&#xff0c;如何获取接口的url、参数、响应等信息呢&#xff1f;&#xff01;答案就更是随口而出&#xff1a;看接口…

深入学习 torch.distributions

0. 引言 前几天分几篇博文精细地讲述了《von Mises-Fisher 分布》, 以及相应的 PyTorch 实现《von Mises-Fisher Distribution (代码解析)》, 其中以 Uniform 分布为例简要介绍了 torch.distributions 包的用法. 本以为已经可以了, 但这两天看到论文 The Power Spherical dist…

microk8s 报错tls: failed to verify certificate: x509:

问题&#xff1a; ssh命令出现如下图所示 输入任何microk8s的容器命令几乎都是x509报错 kubectl get pods -ALL 原因&#xff1a; 证书过期 相关文档&#xff1a; MicroK8s - 服务和端口 Microk8S v1.24 - refresh-certs 似乎无法刷新证书 问题 #3241 规范/microk8s Git…

【Linux系统】--- Linux内核日志等级详解

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Linux系统】--- Linux内核日志等级详解…

小白跟做江科大32单片机之LED流水灯

1.复制下面地址新建的工程&#xff0c;改名为3-2 LED流水灯 小白跟做江科大32单片机之LED闪烁-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139295351?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2213929…

Opencv图像处理技术(图像轮廓)

1图像轮廓概念&#xff1a; 图像轮廓是指图像中连续的像素边界&#xff0c;这些边界通常代表了图像中的物体或者物体的边缘。在数字图像处理中&#xff0c;轮廓是由相同像素值组成的曲线&#xff0c;它们连接相同的颜色或灰度值&#xff0c;并且具有连续性。轮廓可以用来描述和…

CAD石墨烯生成器 V1.0 渊鱼

插件介绍 CAD石墨烯生成器插件可用于在AutoCAD软件内参数化建立石墨烯几何模型。插件建立石墨烯的球棍模型&#xff0c;可控制模型的尺寸、碳原子环的尺寸、原子直径、化学键直径&#xff0c;并可控制模型的起伏形态。插件生成的实体模型可进行修改或绘图渲染&#xff0c;用于…

做视频号小店和达人对接的好,爆单少不了!

大家好&#xff0c;我是喷火龙。 目前&#xff0c;视频号是没有什么自然流量的&#xff0c;所以&#xff0c;想要出单、爆单的话&#xff0c;靠达人带货的方式才是最可靠的&#xff0c;靠达人带货是肯定要对接达人&#xff0c;并和达人沟通带货的。 下面给大家讲一讲应该怎么…

python Z-score标准化

python Z-score标准化 Zscore标准化sklearn库实现Z-score标准化手动实现Z-score标准化 Zscore标准化 Z-score标准化&#xff08;也称为标准差标准化&#xff09;是一种常见的数据标准化方法&#xff0c;它将数据集中的每个特征的值转换为一个新的尺度&#xff0c;使得转化后的…

三十五岁零基础转行成为AI大模型开发者怎么样呢?

以下从3个方面帮大家分析&#xff1a; 35岁转行会不会太晚&#xff1f;零基础学习AI大模型开发能不能学会&#xff1f;AI大模型开发行业前景如何&#xff0c;学完后能不能找到好工作&#xff1f; 一、35岁转行会不会太晚&#xff1f; 35岁正处于人生的黄金时期&#xff0c;拥…

今日选题.

诱导读者点开文章的9引真经&#xff08;二&#xff09; 标题重要么&#xff1f;新媒体、博客文通常在手机上阅读。首先所有的内容不同于纸媒&#xff0c;手机只展现标题&#xff0c;而内容都是折叠。其次读者能像看内容一样看4、5条或者7、8条标题&#xff08;区别于不同的主流…

代码助手之-百度Comate智能体验

简介 越来越多的厂商提供了智能代码助手&#xff0c;百度也不例外。Baidu Comate&#xff08;智能代码助手&#xff09;是基于文心大模型&#xff0c;Comate取自Coding Mate&#xff0c;寓意大家的AI编码伙伴。Comate融合了百度内部多年积累的编程现场大数据和外部开源代码和知…

如何顺利通过软考中级系统集成项目管理工程师?

中级资格的软考专业包括"信息系统"&#xff0c;属于软考的中级级别。熟悉软考的人都知道&#xff0c;软考分为初级、中级和高级三个级别&#xff0c;涵盖计算机软件、计算机网络、计算机应用技术、信息系统和信息服务五个专业&#xff0c;共设立了27个资格。本文将详…

全程曝光 计算机领域顶会投稿后会经历哪些关键环节?

会议之眼 快讯 亲爱的计算机领域大牛们&#xff0c;当你挥洒汗水&#xff0c;精心打磨一篇科研论文&#xff0c;终于怀着激动的心情投稿至顶会——&#xff08;如&#xff08;ACM MM 、ACL、AAAI&#xff09;时&#xff0c;你是否想知道接下来这篇论文会经历怎样的旅程&#x…

Mybatis进阶——动态SQL(1)

目录 一、 <if> 标签 二、<trim> 标签 三、<where> 标签 四、<set> 标签 五、<foreach> 标签 六、<include> 标签 动态SQL 是Mybatis的强大特性之一&#xff0c;能够完成不同条件下的不同SQL拼接&#xff0c;可以参考官方文档&#…

pyQt处理任务等待动画

写了一个显示Qt正在处理内容的等待动画&#xff0c;任务另开一个线程执行&#xff0c;执行完后自动关闭动画 from PyQt5 import QtCore, QtWidgets from PyQt5.QtWidgets import QApplication, QMessageBox, QDialog, QVBoxLayout from PyQt5.QtCore import pyqtSignal, QTime…

springboot 作为客户端接收服务端的 tcp 长连接数据,并实现自定义结束符,解决 粘包 半包 问题

博主最近的项目对接了部分硬件设备&#xff0c;其中有的设备只支持tcp长连接方式传输数据&#xff0c;博主项目系统平台作为客户端发起tcp请求到设备&#xff0c;设备接收到请求后作为服务端保持连接并持续发送数据到系统平台。 1.依赖引入 连接使用了netty&#xff0c;如果项…

CPU占用率很高,相应很慢排查思路

获取线程状态 通过top -c命令可以动态显示进程及其占用资源的排行榜 可以看到&#xff0c;CPU占用率100%的PID是80972&#xff0c;定位到该进程之后&#xff0c;我们再从线程的dump日志中去定位. 使用top -H -p 80972命令查找到该进程中消耗CPU最多的线程&#xff0c;从下面的…

Apose.Words 常用对象详解

系列文章目录 文章目录 系列文章目录前言一、基础对象1. moveToBookmark 前言 本文介绍 Apose.Words 的常用对象的含义及使用方法。 一、基础对象 1. moveToBookmark 将指针移动到书签位置。 moveToBookmark(String bookmarkName, boolean isStart, boolean isAfter) book…