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

news2024/11/15 22:51:11

哈喽,我是阿佑,上篇文章带领了大家跨入的异步魔法的大门——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数据库交互之旅告一段落。希望你们喜欢这段旅程,也希望你们从中学到了很多。如果你有任何问题,或者想要继续探索魔法世界,随时欢迎回来。祝你们的魔法之路充满乐趣和成功!再见!🧙‍♂️✨

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

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

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

相关文章

[Linux系统编程] 静态库与动态库

一.库的概念 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。库有两种&#xff1a;静态库&#xff08;.a、.lib&#xff09;和动态库&#xff08;.so、.dll&#xff09;。…

[leetcode hot 150]第一百九十一题,位1的个数

题目&#xff1a; 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中设置位的个数&#xff08;也被称为汉明重量&#xff09;。 这道题比较简单&#xff0c;直接对最后一位进行与1的与操作&#xff0c;然…

JVM之垃圾判断的详细解析

垃圾判断 垃圾介绍 垃圾&#xff1a;如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾 作用&#xff1a;释放没用的对象&#xff0c;清除内存里的记录碎片&#xff0c;碎片整理将所占用的堆内存移到堆的一端&#xff0c;以便 JVM 将整理出的内…

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…

Mybatis进阶——动态SQL(1)

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

端到端目标检测 |从DETR 到 GroundingDINO

文章目录 一&#xff0c;DETR1. 简介2. 亮点3. 细节4. 总结一下 二&#xff0c;GroundingDINOGrounding DINO的整体流程Grounding DINO的目标函数 一&#xff0c;DETR 之前的目标检测框架&#xff0c;需要很多的人工干预&#xff0c;很多的先验知识&#xff0c;而且可能还需要…

AppInventor2 表格布局的外面的黑框怎么去掉?

问&#xff1a;表格布局的外面的黑框怎么去掉啊&#xff1f; 答&#xff1a;这个黑框是界面设计的布局位置示意&#xff0c;实际 App 测试时并没有框。 来源&#xff1a;AppInventor2 表格布局的外面的黑框怎么去掉&#xff1f; - App应用开发 - 清泛IT社区&#xff0c;为创新…

SQL查询电商数据案例

包括&#xff0c;Python连接数据库到模拟电商数据库&#xff0c;到sql场景查询 1,Python连接SQL数据库 以下是使用Python连接MySQL数据库并进行操作的示例代码&#xff1a; import random import time import pymysql# 定义名字数据 xing ["王", "李",…

uni-app学习完结

昨天空余一天&#xff0c;并未写记录&#xff0c;是昨天属于项目完结&#xff0c;这里把最后的打包上线等这里说下。 打包成微信小程序 打包成微信小程序&#xff0c;这需要再微信公众平台里面&#xff0c;进行登陆和设置。这里说下&#xff0c;注册的后&#xff0c;选择需要…

文心智能体平台丨创建你的四六级学习小助手

引言 在人工智能飞速发展的今天&#xff0c;我们迎来了文心智能体平台。该平台集成了最先进的人工智能技术&#xff0c;旨在为用户提供个性化、高效的学习辅助服务。今天&#xff0c;我们将向大家介绍如何利用文心智能体平台&#xff0c;创建一个专属于你的四六级学习小助手。…

zabbix客户端启用ping脚本 , 采集结果返回服务端

1.Zabbix-agent配置 (1) 查看自定义配置的目录位置 # more /etc/zabbix/zabbix_agentd.conf (2) 将配置的脚本放在指定的目录下 # cd /etc/zabbix/zabbix_agentd.d # vi get_ping.conf UserParameter=get_ping[*], /bin/ping -c 1 -W 1 $1 &> /dev/null &a…

未在计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序和未在本地计算机上注册“microsoft.ACE.OLEDB.12.0”提供程序

程序运行出现下图的错误&#xff0c; 或者下图的错误&#xff0c; 首先看一下是不是运行的程序的位数&#xff08;32/64&#xff09;不对&#xff1b; 查看系统位数的方法如下图&#xff1b;下图显示是64位操作系统&#xff1b; 如果运行的程序的位数没有问题&#xff1b; 则需…

MySQL-innodb后台线程

文章目录 一、结构图二、后台线程①Master Thread②IO Thread③Purge Thread④Page Cleaner Thread 拓展知识 一、结构图 二、后台线程 InnoDB是多线程的模型&#xff0c;因此其后台有多个不同的后台线程&#xff0c;负责处理不同的任务 后台线程有&#xff1a; ①Master Thr…

BevDet(1): 算法原理介绍介绍

BevDet是一个LSS-Based的实时高性能的多相机3D检测模型,它用4阶段的范式去做3D目标检测,设计上同时支持Segmentation。何谓4阶段范式: 1.图像域的特征提取(Image -view Encoder)2.视角转换 (View Transformer)3.Bev空间特征提取(BEV Encoder)4.任务头Head它涉及 Image View …

【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装

livekit-agent 依赖于livekit、livekit-api、livekit-protocol 其中livekit就是livekkit-rtc: 包含俩sdk 实时互动sdkReal-time SDK for connecting to LiveKit as a participant livekit-api : 服务端sdk https://pypi.org/project/livekit-api/ livekit的python sdk

Plesk面板上网站无法访问如何查看日志

近期我的网站出现无法访问的问题&#xff0c;这边想要查询为什么出现无法访问的原因&#xff0c;但不知道如何在主机上面进行检查&#xff0c;由于我使用的Hostease的Windows虚拟主机产品默认带普通用户权限的Plesk面板&#xff0c;因此联系Hostease的咨询了Hostease技术支持&a…

嵌入式不一定只能用C!

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手动分割线-------------------------------------------------------------------------------- 本文章参考了以下文章&#xff1a; 这里是引用 ------------…

算法与数据结构高手养成:朴素的贪心法(上)最优化策略

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Linux离线一键安装Docker及docker-compose环境

背景&#xff1a; 在当前软件部署运维环境中由于Docker容器化优势越来越明显&#xff0c;因些被许多公司运维所采用&#xff0c;那首先如何快速安装Docker及docker-compose基础环境就第一时间被人们关注&#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…