「异步魔法: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 select

async 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_base

Base = 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 User

class 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.title

class 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, Comment

admin.site.register(Post)
admin.site.register(Comment)

用户认证

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

# 添加'django.contrib.auth'到INSTALLED_APPS

INSTALLED_APPS = [
    # ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.admin',
    'posts',  # 我们的应用
]

# 设置LOGIN_REDIRECT_URL和LOGOUT_REDIRECT_URL

LOGIN_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 Post

def 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, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('posts.urls')),  # 包含posts应用的URL
]

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

from django.urls import path
from . import views

urlpatterns = [
    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 Comment

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

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

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

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

相关文章

如何使用 .htaccess 删除文件扩展名

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何使用 .htaccess 删除文件扩展名&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您有…

C# 数组/集合排序

一&#xff1a;基础类型集合排序 /// <summary> /// 排序 /// </summary> /// <param name"isReverse">顺序是否取反</param> public static void Sort<T>(this IList<T> array, bool isReverse false)where T : IComparable …

洗地机什么品牌质量好?家用洗地机排行榜

一年一度的大促节又到了&#xff0c;各大电商平台和实体店纷纷推出力度不小的折扣活动&#xff0c;吸引着消费者的关注和购买欲望。很多家庭也趁着这个机会&#xff0c;购置一些智能家居产品来提升生活品质。其中&#xff0c;洗地机作为近年来发展迅速的明星产品&#xff0c;受…

Mac安装tomcat

代码 brew install tomcat 运行结果如下&#xff1a; 如果要启动输入&#xff1a; brew services start tomcat

鸿蒙课程培训 | 讯方技术与鸿蒙生态服务公司签约,成为鸿蒙钻石服务商

3月15日&#xff0c;深圳市讯方技术股份有限公司与鸿蒙生态服务公司签署合作协议&#xff0c;讯方技术成为鸿蒙钻石服务商&#xff0c;正式进军鸿蒙原生应用培训开发领域。讯方技术总裁刘国锋、副总经理刘铭皓、深圳区域总经理张松柏、深圳区域交付总监张梁出席签约仪式。 作…

【全开源】防伪溯源一体化管理系统源码(FastAdmin+ThinkPHP和Uniapp)

一款基于FastAdminThinkPHP和Uniapp进行开发的多平台&#xff08;微信小程序、H5网页&#xff09;溯源、防伪、管理一体化独立系统&#xff0c;拥有强大的防伪码和溯源码双码生成功能&#xff08;内置多种生成规则&#xff09;、批量大量导出防伪和溯源码码数据、支持代理商管理…

3D模型展示适合哪些类型的产品?

3D模型展示特别适合那些需要全面展示产品细节和特性的商品&#xff0c;产品3D交互展示具有直观性、动态性、交互性等显著优势&#xff0c;可以通过51建模网一站式完成商品3D建模、3D展示、3D定制、AR试穿等功能&#xff0c;以下是一些适合使用3D模型展示的产品类型&#xff1a;…

低代码开发难吗?

在软件开发的多样化浪潮中&#xff0c;低代码开发平台以其简化的编程模型&#xff0c;为IT行业带来了新的活力。作为一位资深的IT技术员&#xff0c;我对低代码开发平台的易用性和强大功能有着深刻的认识。今天&#xff0c;我将分享我对YDUIbuilder这一免费开源低代码平台的使用…

29-ESP32-S3-WIFI_Driver-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分&#xff0c;其实内容比我想象的要多得多。所以通常来说&#xff0c;如果你想要编写自己的Wi-Fi应用程序&#xff0c;最快捷的方法就是先找一个类似的示例应用&#xff0c;然后将它的相…

图片去水印工具(低调用哦)

一、简介 1、它是一款专业的图像编辑工具&#xff0c;旨在帮助用户轻松去除照片中不需要的元素或修复照片中的缺陷。无论是修复旧照片、消除拍摄时的不良构图&#xff0c;还是删除照片中的杂乱元素&#xff0c;都能帮助用户快速实现这些目标。其功能强大且操作简单&#xff0c…

继承--5.29

继承格式&#xff1a; package javatest2;public class people {int age;double workday;public people(int age, double workday) {this.age age;this.workday workday;} }package javatest2;public class student extends people {int studyday;public student(int age, d…

使用目标检测模型YOLO V9 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

我看到YOLO V8中&#xff08;ultralytics版本8.2.18&#xff09;集成了YOLO V9&#xff0c;所以直接在YOLO V8 OBB的基础上实现YOLO V9 OBB&#xff0c;训练结果也出来了&#xff0c;但是评估指标比YOLO V8 OBB低一点点&#xff0c;不知道是不是哪里遗漏修改了......如有大神赐…

MAC M1 —— Install

文章目录 MAC M1 —— Install安装IDEA安装JDK安装Maven安装brew无法创建文件 /data/serverMac 修改终端用户名&#xff08;主机名&#xff09;PyCharm MAC M1 —— Install 安装IDEA 关键词&#xff1a;2020到2021.3的激活步骤。找下Download文件夹 安装JDK 在个人的电脑上…

06.深入学习Java 线程

1 线程的状态/生命周期 Java 的 Thread 类对线程状态进行了枚举&#xff1a; public class Thread implements Runnable {public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;} } 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用…

STL库--priority_queue

目录 priority_queue定义 prority_queue容器内元素的访问 priority_queue()常用函数实例解析 priority_queue内元素优先级的设置 priority_queue的常见用途 priority_queue又称为优先队列&#xff0c;其底层是用堆来进行实现的。在优先队列中&#xff0c;队首元素一定是当…

latex中伪代码后面多出=0

这latex简直就是憨猪&#xff01;&#xff01;&#xff01; \usepackage{algpseudocode} 注释掉&#xff0c;或者删除就可以了 还有&#xff0c;引用包的时候一般begin{}中括号里是什么就引入什么包。 这下面这几行&#xff0c;开始全爆红说没定义&#xff0c;我就去一行一行问…

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

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

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第26节-内嵌blender展厅

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第26节-内嵌blender展厅 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…

【机器学习-k近邻算法-01】 | Scikit-Learn工具包进阶指南:机器学习sklearn.neighbors模块之k近邻算法实战

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

轧钢测径仪分析软件,四大图表带来产线新视角!

轧钢测径仪是智能化检测设备&#xff0c;除了测径仪主体外&#xff0c;还配有测控软件系统&#xff0c;从这里可对测径仪进行各种设置&#xff0c;亦可从此观测到测径仪获得的各种信息&#xff0c;如检测信息、分析图表、计算尺寸、历史数据等。而从测径仪获得的图表信息主要有…