当前位置: 首页 > news >正文

sqlalchemy库详细使用

SQLAlchemy 是 Python 中最强大、最受欢迎的 ORM(对象关系映射)库,它允许你使用 Python 对象来操作数据库,而不需要直接编写 SQL 语句。同时,它也提供了对底层 SQL 的完全控制能力,适用于从简单脚本到大型企业级应用的各种场景。


📚 一、简介

✅ 什么是 SQLAlchemy?

  • 开源:MIT 许可证
  • 作者:Michael Bayer
  • 官网:SQLAlchemy - The Database Toolkit for Python
  • 核心功能
    • ORM(对象关系映射)
    • Core(原生 SQL 构建与执行)
    • 连接池、事务管理、类型系统等

🔗 支持的数据库:

PostgreSQL、MySQL、SQLite、Oracle、SQL Server、MariaDB、SQLite、Firebird、Sybase 等。


🛠️ 二、安装

pip install sqlalchemy

如果你使用特定数据库驱动(如 PostgreSQL 的 psycopg2),还需要额外安装:

pip install psycopg2-binary   # PostgreSQL
pip install pymysql           # MySQL

🧱 三、基本结构

SQLAlchemy 主要分为两个部分:

  1. Core:用于构建和执行 SQL 查询语句(适合熟悉 SQL 的用户)
  2. ORM:面向对象方式操作数据库(适合不想写 SQL 的用户)

📦 四、使用示例(ORM 模式)

1. 创建引擎

from sqlalchemy import create_engineengine = create_engine("sqlite:///example.db", echo=True)  # echo=True 显示生成的 SQL

支持多种数据库连接格式:

数据库类型示例连接字符串
SQLitesqlite:///example.db
PostgreSQLpostgresql+psycopg2://user:password@localhost/dbname
MySQLmysql+pymysql://user:password@localhost/dbname

2. 定义模型类(Declarative Base)

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, StringBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)def __repr__(self):return f"<User(name='{self.name}', age={self.age})>"

3. 创建表

Base.metadata.create_all(engine)

4. 创建 Session 工厂

from sqlalchemy.orm import sessionmakerSession = sessionmaker(bind=engine)
session = Session()

5. 插入数据(增)

new_user = User(name="Alice", age=25)
session.add(new_user)
session.commit()

6. 查询数据(查)

# 查询所有用户
users = session.query(User).all()# 条件查询
user = session.query(User).filter_by(name="Alice").first()for user in users:print(user.id, user.name, user.age)

7. 更新数据(改)

user = session.query(User).filter_by(name="Alice").first()
if user:user.age = 26session.commit()

8. 删除数据(删)

user = session.query(User).filter_by(name="Alice").first()
if user:session.delete(user)session.commit()

⚙️ 五、高级用法

1. 使用上下文管理器自动提交事务

from sqlalchemy.orm import Sessionwith Session(engine) as session:with session.begin():new_user = User(name="Bob", age=30)session.add(new_user)

如果发生异常会自动回滚,否则自动提交。


2. 复杂查询

# and 查询
users = session.query(User).filter(User.age > 25, User.name.like('A%')).all()# 排序
users = session.query(User).order_by(User.age.desc()).all()# 聚合函数
from sqlalchemy import func
count = session.query(func.count(User.id)).scalar()

3. 外键与关联表

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationshipclass Address(Base):__tablename__ = 'addresses'id = Column(Integer, primary_key=True)email = Column(String)user_id = Column(Integer, ForeignKey('users.id'))user = relationship("User", back_populates="addresses")User.addresses = relationship("Address", order_by=Address.email, back_populates="user")

🔄 六、异步支持(需要搭配 databases 或 asyncmy)

SQLAlchemy 原生不支持异步(async/await),但可以通过以下方式实现:

  • 使用 databases + asyncpg(PostgreSQL)
  • 使用 sqlalchemy.ext.asyncio(SQLAlchemy >= 1.4)
  • 使用 asyncmy(MySQL 异步驱动)

示例(SQLAlchemy 1.4+ 异步 ORM):

from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmakerengine = create_async_engine("postgresql+asyncpg://user:pass@localhost/dbname")
async_session = sessionmaker(engine, class_=AsyncSession)async with async_session() as session:result = await session.execute(select(User))

🧪 七、测试建议

  • 使用内存数据库进行单元测试(如 sqlite:///:memory:
  • 使用 Alembic 做迁移管理
  • 使用 pytest + fixture 管理 session 和数据初始化

📚 八、推荐学习资源

  • 官方文档(英文)
  • 中文社区文档
  • GitHub 示例仓库
  • 实战项目:Flask + SQLAlchemy / FastAPI + SQLAlchemy

📌 总结

特性是否支持
ORM
原生 SQL 构建
异步支持✅(需配合扩展)
多数据库支持
迁移工具Alembic ✅
高性能批量操作

如果你想更深入掌握 SQLAlchemy,可以尝试阅读它的源码或使用在实际项目中,比如 Flask、FastAPI 后端服务中广泛使用的 ORM 模块。

create_engine

create_engine 是 SQLAlchemy 中用于创建数据库引擎的核心函数,它允许你与数据库建立连接,并通过该连接执行 SQL 语句。下面详细介绍 create_engine 的用法。

基本使用

首先,你需要导入 create_engine 函数并提供一个数据库 URL 来创建引擎实例:

from sqlalchemy import create_engine# 创建一个数据库引擎
engine = create_engine('dialect+driver://username:password@host:port/database')

这里的 dialect+driver 部分指定数据库类型和驱动程序(例如:postgresql+psycopg2),usernamepassword 分别是你的数据库用户名和密码,hostport 分别是数据库服务器的地址和端口,最后的 database 是你要连接的具体数据库名称。

例如,要连接到本地运行的 PostgreSQL 数据库,你可以这样做:

engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase')

连接池设置

create_engine 允许你配置连接池的行为。默认情况下,SQLAlchemy 使用队列式的连接池,限制最大连接数为 5,最小连接数为 5。你可以通过参数自定义这些设置:

engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase',pool_size=10,  # 设置连接池大小max_overflow=20,  # 超出pool_size后的最大溢出连接数
)

执行 SQL 语句

一旦有了引擎实例,就可以使用它来执行 SQL 语句。例如,直接执行一条 SQL 查询:

with engine.connect() as connection:result = connection.execute("SELECT * FROM my_table")for row in result:print(row)

使用 ORM

如果你计划使用 SQLAlchemy 的 ORM 功能,你需要先定义模型类,然后可以利用 engine 来进行操作。首先,需要初始化一个 MetaData 实例和声明基类:

from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class MyTable(Base):__tablename__ = 'my_table'id = Column(Integer, primary_key=True)name = Column(String)# 创建表
Base.metadata.create_all(engine)

之后,你可以使用会话(Session)来进行数据库操作:

from sqlalchemy.orm import sessionmakerSession = sessionmaker(bind=engine)
session = Session()# 插入数据
new_record = MyTable(name='example')
session.add(new_record)
session.commit()# 查询数据
records = session.query(MyTable).all()
for record in records:print(record.name)

总结

  • create_engine 是用于创建数据库连接的基础方法。
  • 它支持多种数据库后端,并允许对连接行为进行高度定制。
  • 结合 SQLAlchemy 的 Core 或 ORM 功能,create_engine 提供了灵活且强大的数据库交互能力。无论是执行原生 SQL 语句还是通过 ORM 操作数据库对象,都变得简单而直观。

declarative_base

declarative_base 是 SQLAlchemy ORM(对象关系映射)中的一个关键函数,用于创建一个基础类,该类的子类可以与数据库表进行关联。通过使用 declarative_base,你可以定义数据库模型作为 Python 类,从而简化了数据库操作。

基本用法

首先,你需要从 sqlalchemy.ext.declarative 模块中导入 declarative_base 函数,并调用它来创建一个基础类:

from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()

这个 Base 类将作为所有模型类的父类。然后,你可以定义你的数据库模型作为 Base 的子类。

定义模型

下面是一个简单的例子,展示了如何定义一个模型类:

from sqlalchemy import Column, Integer, Stringclass User(Base):__tablename__ = 'users'  # 指定数据库表名id = Column(Integer, primary_key=True)  # 主键name = Column(String)age = Column(Integer)def __repr__(self):return f"<User(name={self.name}, age={self.age})>"

在这个例子中,我们定义了一个名为 User 的模型类,它对应数据库中的 users 表。id, name, 和 age 分别是这个表中的列。

创建表

一旦你定义了模型,你可以使用 Base.metadata.create_all(engine) 方法基于这些模型创建相应的数据库表:

from sqlalchemy import create_engine# 创建一个引擎实例
engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase')# 根据模型创建表
Base.metadata.create_all(engine)

确保在执行这段代码之前已经正确配置了数据库连接字符串。

使用会话进行数据库操作

为了对数据库执行插入、查询、更新和删除等操作,你需要创建一个会话:

from sqlalchemy.orm import sessionmaker# 创建Session类
Session = sessionmaker(bind=engine)
session = Session()# 插入新记录
new_user = User(name='John Doe', age=30)
session.add(new_user)
session.commit()# 查询记录
users = session.query(User).filter_by(name='John Doe').all()
for user in users:print(user)# 更新记录
user = session.query(User).first()
user.age = 31
session.commit()# 删除记录
session.delete(user)
session.commit()

总结

  • declarative_base 提供了一种声明式的方式来定义数据库模型。
  • 通过继承自 Base 的子类,你可以方便地定义与数据库表对应的模型。
  • 使用 create_all 方法可以基于模型自动创建数据库表。
  • 利用 sessionmaker 创建的会话,可以轻松实现对数据库的增删改查操作。

这种方法使得处理数据库变得更加直观和易于管理,特别是在大型项目中维护复杂的数据结构时非常有用。

sessionmaker

sessionmaker 是 SQLAlchemy ORM 中用于创建新 Session 对象的工厂类。Session 是 SQLAlchemy 与数据库交互的核心接口之一,通过它你可以执行查询、插入、更新和删除等操作。下面详细介绍 sessionmaker 的用法。

基本使用

首先,你需要导入 sessionmaker 并创建一个 sessionmaker 工厂,同时将其绑定到一个数据库引擎实例上:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# 创建数据库引擎
engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase')# 创建一个配置好连接到该引擎的 sessionmaker 工厂
Session = sessionmaker(bind=engine)# 创建一个新的会话对象
session = Session()

使用 Session 进行数据库操作

一旦有了 session 实例,你就可以利用它来对数据库进行各种操作了。

插入数据
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, StringBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 添加新用户
new_user = User(name='John Doe', age=30)
session.add(new_user)
session.commit()  # 提交事务以保存更改
查询数据
# 查询所有用户
users = session.query(User).all()
for user in users:print(user.name, user.age)# 根据条件查询
johns = session.query(User).filter_by(name='John Doe').all()
for john in johns:print(john.name, john.age)
更新数据
# 查找并更新用户信息
user = session.query(User).filter_by(name='John Doe').first()
if user:user.age = 31  # 更新年龄session.commit()  # 记得提交更改
删除数据
# 删除用户
user = session.query(User).filter_by(name='John Doe').first()
if user:session.delete(user)session.commit()

高级用法

  • 自动提交:默认情况下,sessionmaker 不启用自动提交(autocommit)。这意味着你需要显式调用 session.commit() 来提交事务。如果你希望每次操作后自动提交,可以在创建 sessionmaker 时设置 autocommit=True,但通常不推荐这样做,因为它可能导致意外的数据丢失或一致性问题。

    Session = sessionmaker(bind=engine, autocommit=True)
  • 事务管理:可以使用上下文管理器来管理事务,确保在发生异常时能正确回滚事务。

    with session.begin():# 执行数据库操作user = User(name='Jane Doe', age=28)session.add(user)# 如果这里抛出异常,事务将自动回滚
  • 批量操作:当你需要添加多个对象时,可以使用 add_all() 方法。

    session.add_all([User(name='Alice', age=25),User(name='Bob', age=26)
    ])
    session.commit()

通过这些方法,你可以非常灵活地与数据库进行交互,无论是简单的增删改查操作还是更复杂的业务逻辑处理。sessionmaker 提供了一个强大且易于使用的接口,使得数据库编程变得更加简单直接。

事务管理->详解

在 SQLAlchemy 中,sessionmaker 创建的 Session 对象可以通过上下文管理器(即使用 with 语句)来自动管理事务。这种方式非常方便,因为它可以在代码块成功完成时自动提交事务,并在发生异常时自动回滚事务,从而确保数据的一致性和完整性。

使用上下文管理器进行事务管理

当你使用 with 语句结合 session.begin() 来管理事务时,不需要手动调用 session.commit()session.rollback()。如果代码块执行过程中没有抛出异常,则事务会被自动提交;如果发生了异常,则事务会自动回滚。

示例代码

以下是一个使用上下文管理器管理事务的例子:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmakerBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建引擎和 sessionmaker 工厂
engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase')
Session = sessionmaker(bind=engine)# 使用上下文管理器管理事务
with Session() as session:with session.begin():# 插入新用户new_user = User(name='John Doe', age=30)session.add(new_user)# 如果在此处抛出异常,事务将自动回滚# 没有异常时,事务将在 with 块结束时自动提交

在这个例子中,session.begin() 返回一个上下文管理器,它会在进入 with 块时开始一个新的事务,在退出 with 块时根据是否发生异常来决定是提交还是回滚事务。

结合 try-except 的高级使用

虽然使用 with session.begin() 可以简化事务管理,但在某些情况下,你可能还需要更细致地控制异常处理逻辑。例如,你可能想要在捕获特定类型的异常时执行一些额外的操作。在这种情况下,可以结合 try-except 结构使用:

from sqlalchemy.exc import SQLAlchemyErrorwith Session() as session:try:with session.begin():new_user = User(name='Jane Doe', age=28)session.add(new_user)# 模拟异常raise ValueError("Something went wrong!")except SQLAlchemyError as e:print(f"An error occurred while committing the transaction: {e}")# 注意:由于 with session.begin() 自动处理了回滚,这里不需要显式调用 session.rollback()except Exception as e:print(f"An unexpected error occurred: {e}")

在这个示例中,即使发生了异常,事务也会被自动回滚,但你可以通过 except 块来执行额外的错误处理或日志记录操作。

总结
  • 简化事务管理:使用 with session.begin() 可以大大简化事务管理,使代码更加简洁易读。
  • 自动提交与回滚:当代码块成功完成时,事务会自动提交;如果发生异常,事务会自动回滚。
  • 灵活性:尽管 with 语句提供了便捷的事务管理方式,但在需要更复杂的错误处理时,仍可以通过结合 try-except 结构来实现。

这种模式非常适合用于需要保证事务完整性的场景,如金融交易、库存管理等关键业务流程。通过这种方式,不仅可以减少代码量,还能提高代码的健壮性和可维护性。

create_all

Base.metadata.create_all(engine) 是 SQLAlchemy 中用于基于已定义的模型创建数据库表的一个方法。这个方法会检查 Base 类(由 declarative_base() 创建)的所有子类,并在数据库中创建对应的表结构,如果这些表还不存在的话。下面详细说明它的用法和一些相关的注意事项。

基本使用

首先,你需要定义你的数据库模型,并通过调用 create_all 方法来创建相应的表:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建一个引擎实例
engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase')# 根据模型创建表
Base.metadata.create_all(engine)

在这个例子中,我们定义了一个名为 User 的模型类,并通过 Base.metadata.create_all(engine) 在数据库中创建了对应的 users 表。

参数详解

create_all 方法接受几个可选参数,允许你进一步控制表的创建过程:

  • checkfirst:默认为 True。如果设置为 True,则只会创建那些尚未存在的表;如果设置为 False,将无条件地尝试创建所有表,即使它们已经存在。

    Base.metadata.create_all(engine, checkfirst=True)
  • tables:可以指定要创建的表集合。如果你只想创建特定的一些表而不是所有表,可以通过此参数传递一个表对象列表。

     python 

    深色版本

    from sqlalchemy import Table# 假设还有另一个模型叫做 Address
    Base.metadata.create_all(engine, tables=[User.__table__, Address.__table__])

注意事项

  1. 外键约束:如果模型之间有外键关系,请确保在执行 create_all 时所有相关联的表都包含在内,以避免由于缺失依赖表而导致的错误。

  2. 数据库URL:确保提供的数据库连接字符串(即创建 engine 时使用的 URL)是正确的,并且应用程序对数据库有足够的权限来创建表。

  3. 已有数据:请注意,create_all 不会处理数据库中的已有数据或修改现有表结构。如果需要更新表结构而不丢失数据,考虑使用迁移工具如 Alembic。

  4. 事务管理:虽然 create_alldrop_all(删除所有表)操作通常是在没有活动事务的情况下执行的,但最好还是在一个明确的上下文中进行这些操作,例如在应用初始化阶段。

示例:完整流程

以下是一个完整的示例,展示了如何定义模型、创建引擎并生成表:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)if __name__ == "__main__":engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase')Base.metadata.create_all(engine)print("Tables created successfully.")

通过这种方式,你可以轻松地根据你的 ORM 模型动态地创建数据库表结构。

相关文章:

sqlalchemy库详细使用

SQLAlchemy 是 Python 中最强大、最受欢迎的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许你使用 Python 对象来操作数据库&#xff0c;而不需要直接编写 SQL 语句。同时&#xff0c;它也提供了对底层 SQL 的完全控制能力&#xff0c;适用于从简单脚本到大型企…...

最短路和拓扑排序知识点

1、在一个有权无向图中&#xff0c;如果顶点b到顶点a的最短路径长度是10&#xff0c;顶点c与顶点b之间存在一条长度为3的边。&#xff08;c与a的最短路径长度不超过13&#xff1b;c与a的最短路径不小于7&#xff09; 2、我们用一个有向图来表示航空公司所有航班的航线。最适合…...

【Alist+RaiDrive挂载网盘到本地磁盘】

1.安装准备 安装RaiDrive RaiDrive - 像 USB 驱动器一样安装云存储 安装alist 安装方式请查看官网: AList文档 2.启动Alist(docker) docker官网 Install | Docker EngineDocker Desktop | Docker Docs 运行容器 docker run -d --restartalways -v /home/alist:/opt/alist/…...

达梦数据库 【-6111: 字符串转换出错】问题处理

达梦数据库 【-6111: 字符串转换出错】问题处理 问题背景问题分析问题总结 问题背景 今天在更新数据库某一个值属性的时候&#xff0c;执行更新语句报错提示 -6111: 字符串转换出错&#xff0c;但是自己检查了sql语句&#xff0c;只是一个简单的sql&#xff0c;并没有需要字符…...

Java的多线程笔记

创建一个线程的方法有多种&#xff0c;比如可以继承Thread类或者实现Runnable接口&#xff0c;结论是实现Runnable接口比前者更加优越。 二者代码对比 Java 不支持多继承&#xff0c;如果你继承了 Thread 类&#xff0c;就不能再继承其他类&#xff0c;实现 Runnable 接口后&am…...

学习51单片机01(安装开发环境)

新学期新相貌.......哈哈哈&#xff0c;我终于把贪吃蛇结束了&#xff0c;现在我们来学stc51单片机&#xff01; 要求&#xff1a;c语言的程度至少要到函数&#xff0c;指针尽量&#xff01;如果c语言不好的&#xff0c;可以回去看看我的c语言笔记。 1.开发环境的安装&#x…...

互联网协议的多路复用、Linux系统的I/O模式

目录 1. 互联网协议栈-多路复用 1.1. 应用层的多路复用 2.2. 传输层的多路复用 3.3. 网络层的多路复用 2. Linux系统的I/O模式 2.1. I/O 2.2. Socket 2.3. 从网卡到操作系统 2.4. Socket 编程模型 2.5. I/O多路复用 2.6. 阻塞/非阻塞、同步/异步 2.7. Question 1. …...

vue中,created和mounted两个钩子之间调用时差值受什么影响

在 Vue 中&#xff0c;created 和 mounted 是两个生命周期钩子&#xff0c;它们之间的调用时差主要受以下几个因素影响&#xff1a; &#x1f7e2; 1. 模板复杂度与渲染耗时&#xff08;最主要因素&#xff09; mounted 的触发时间是在组件的 DOM 被挂载之后&#xff08;也就是…...

软件设计师考试《综合知识》计算机编码考点分析——会更新软设所有知识点的考情分析,求个三连

2019-2023年真题深度解析与备考策略 分值占比分析 75分中编码相关分值分布与核心考点 年份编码相关题量分值占总分比例核心考点20232题2分2.67%补码表示范围、IEEE 754偏移量20223题3分4.00%原码/反码比较、浮点数规格化20211题1分1.33%补码表示-1的能力20202题2分2.67%移码…...

剖析提示词工程中的递归提示

递归提示:解码AI交互的本质,构建复杂推理链 递归提示的核心思想,正如示例所示,是将一个复杂任务分解为一系列更小、更易于管理、逻辑上前后关联的子任务。每个子任务由一个独立的提示来驱动,而前一个提示的输出(经过必要的解析和转换)则成为下一个提示的关键输入。这种…...

【SSL证书系列】https双向认证中客户端认证的原理

HTTPS双向认证&#xff08;也称为双向SSL/TLS认证&#xff09;是一种增强安全性的机制&#xff0c;其中客户端和服务器都需要验证彼此的数字证书&#xff0c;以确保双方身份的真实性。以下是其核心原理和步骤的详细解析&#xff1a; 一、双向认证的核心目标 双向身份验证&#…...

map格式可以接收返回 fastjson2格式的数据 而不需要显示的转换

Fastjson2 JSONObject 与 Map 的关系 Fastjson2 的 JSONObject 类定义如下&#xff1a; public class JSONObject extends JSON implements Map<String, Object>, Cloneable {// 实现了 Map 接口的所有方法&#xff08;put、get、keySet 等&#xff09; }解释&#xff…...

NHANES稀有指标推荐:PWI

文章题目&#xff1a;Association between plain water intake and the risk of osteoporosis among middle-aged and elderly people in the United States: a cross-sectional study DOI&#xff1a;10.3389/fnut.2025.1527771 中文标题&#xff1a;美国中老年人白开水摄入与…...

CN 第二章 应用层-单选题

非并行TCP连接 HTTP非持续连接 假定在同一Web服务器上的某HTML文件引用了3个非常小的对象&#xff08;例如图片&#xff09;。忽略传输时延&#xff0c;往返时延为RTT&#xff0c;不考虑连接释放时间&#xff0c;采用非并行TCP连接的HTTP非持续连接方式将该页面完整接收下来需…...

游戏引擎学习第279天:将实体存储移入世界区块

黑板讲解&#xff1a;为什么使用SOA&#xff08;结构体数组&#xff09;而不是AOS&#xff08;数组结构体&#xff09;来构建实体系统 我们在构建游戏实体系统时&#xff0c;探讨了使用结构体数组&#xff08;SOA, Struct of Arrays&#xff09;而不是结构体组成的数组&#x…...

zabbix7.2最新版本 nginx自定义监控(三) 设置触发器

安装zabbix-get服务 在zabbix-server端口安装zabbix-get服务 [rootlocalhost ~]# dnf install -y zabbix-get Last metadata expiration check: 1:55:49 ago on Wed 14 May 2025 09:24:49 AM CST. Dependencies resolved. Package Architectur…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- OpenAI AGI 五阶段

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- OpenAI AGI 五阶段 然后第三个阶段就是agent,注意这里面的agent和我们说应用程序开发的这个agent是一个不同的概念。AI just can take actions autonomously自动的去执行一些动作。但大家像今天我们看到…...

Flink实时统计任务CPU异常排查与解决方案

一、核心原因分析 ‌资源配置不合理‌ ‌CPU核数与并行度不匹配‌:TaskManager的taskmanager.numberOfTaskSlots设置过高,导致单个节点负载过载(如32核节点设置2个slot被多个任务占用,总需求超过物理CPU核数)。‌内存与CPU分配不均‌:内存不足引发频繁GC,间接导致CPU利…...

Vue3指令(二)--v-text、v-html数据渲染,计算属性

目录 &#xff08;一&#xff09;数据渲染 1.插值表达式渲染数据 1.1实战案例 1.1.1代码&#xff1a; 1.1.2实现截图&#xff1a; 2.使用v-text和v-html来渲染数据 2.1实战案例&#xff1a; 2.1.1代码&#xff1a; 2.1.2实现截图&#xff1a; &#xff08;二&#xff…...

【深入Spring系列】源码级深入剖析SpringBoot如何实现自动装载

1. SpringBoot自动装载 Spring Boot 实现“自动装载”&#xff08;Auto Configuration&#xff09;是其最核心、最强大的功能之一&#xff0c;使得开发者可以快速搭建项目而无需进行复杂的 XML 配置。这一机制的底层实现主要依赖于 Spring Framework 的条件注解机制 和 Spring…...

【AI News | 20250514】每日AI进展

AI Repos 1、ocr-workbench OCR Workbench 是一款使用 AI&#xff08;Gemini 或 Tesseract&#xff09;进行文档光学字符识别&#xff08;OCR&#xff09;并生成 Markdown 或 HTML 转录的开源 Web 应用。它专为处理需要大量编辑的 OCR 文本而设计&#xff0c;特别是老旧文档。…...

嵌入式设计模式基础--C语言的继承封装与多态

继承&#xff0c;封装和多态是OOP的三大核心特性&#xff0c;它们共同构了面向对象的基础.但嵌入式开发中大量的使用到的却是C语言这种面向过程的语言&#xff0c;那么我们就需要了解如何在C中使用设计模式的思想做功能开发。要了解设计模式&#xff0c;我们就需要先搞清楚 继承…...

【python爬虫】python+selenium实现Google Play Store应用信息爬虫+apk下载

实验要求&#xff1a;利用pythonselenium实现Google Play Store应用信息爬虫apk下载。 其中&#xff1a; 1、热门应用列表包含200个app&#xff0c;需要点击右侧按钮滑动产生下一页数据&#xff0c;所以需要Selenium来控制页面操作。 2、每个应用的爬虫信息包括&#xff1a;ap…...

RPC协议及库介绍

一.RPC介绍 RPC(Remote Procedure Call)&#xff0c;远程过程调用协议&#xff0c;客户端在不知道调用细节的情况下&#xff0c;调用存在于远程计算机上的某个对象&#xff0c;就像调用本地应用程序中的对象一样&#xff0c;即允许像调用本地服务一样调用远程服务。 RPC框架的…...

【教程】Docker更换存储位置

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景说明 更换教程 1. 停止 Docker 服务 2. 创建新的存储目录 3. 编辑 Docker 配置文件 4. 迁移已有数据到新位置 5. 启动 Docker 服务 6…...

vue3实现JSON格式化和JSONPath提取功能

功能简介 1、JSON数据的格式化 2、通过JSONPath语法对格式化后的数据匹配提取 基础环境参考 vue3flasksqlite前后端项目实战 包安装 npm install jsonpath src/views/JsonFormat.vue <template><div class"json-formatter-container"><el-card cla…...

【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)

该系列项目整体介绍及源代码请参照前面写的一篇文章​​​​​​【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; 一般情况下&#xff0c;我们远程调用服务&#xff0c;可以用restTemplate来进行http请求的访问。接…...

在 Angular 中, `if...else if...else`

在 Angular 中&#xff0c;模板语法本身并不直接支持 if...else if...else 这样的多条件分支结构。不过&#xff0c;你可以通过使用 *ngIf 指令结合其else模板功能来实现类似的效果。下面是如何模拟if...else if...else逻辑的方法&#xff1a; 示例&#xff1a;实现if...else …...

深入掌握 Python 切片操作:解锁数据处理的高效密码

在 Python 的编程宇宙中&#xff0c;每一个开发者都在不断探索各种强大且实用的工具&#xff0c;以提升代码的效率与灵活性。其中&#xff0c;切片操作作为 Python 数据处理领域的核心技能之一&#xff0c;就像是一把精巧的瑞士军刀&#xff0c;无论是处理文本信息、分析数据列…...

基于 Kubernetes 部署容器平台kubesphere

一 前言&#xff1a; k8s 大家都已经非常熟悉了&#xff0c;网上流传着非常多的搭建部署文档&#xff0c;有kubeadmin的有二进制的&#xff0c;还有基于第三方的部署工具的&#xff0c;反正是各种部署方法都有&#xff0c;k8s部署技术热门可见一斑。但是不管哪种部署都需要了解…...

lua 作为嵌入式设备的配置语言

从lua的脚本中获取数据 lua中栈的索引 3 | -1 2 | -2 1 | -3 可以在lua的解释器中加入自己自定的一些功能,其实没啥必要,就是为了可以练习下lua...

NVMe简介2

共分2部分&#xff0c;这里是第2部分。 NVMe数据结构 NVMe协议中规定每个提交命令的大小为64字节&#xff0c;完成命令大小为16字节&#xff0c;NVMe命令分为Admin和IO两类&#xff0c;NVMe的数据块组织方式有PRP和SGL两种。提交命令的格式如图5所示。 图5 提交命令数据格 N…...

具身智能梳理以及展望

具身智能相关技术与发展历程 具身智能概念 具身智能指具有自身体验、改变物理世界的智能。 过去 5.4 亿年&#xff0c;地球所有生物智能由身体作用于世界的行为塑造。 1950 年&#xff0c;图灵在《Computing Machinery and Intelligence》论文中首次提出具身智能&#xff0…...

【Redis实战篇】秒杀优化

1. 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单…...

【​​HTTPS基础概念与原理​】TLS握手过程详解​​

以下是 TLS握手过程的详细拆解&#xff0c;涵盖客户端与服务器之间的关键交互步骤&#xff0c;包括ClientHello、ServerHello、证书验证、密钥交换等核心阶段&#xff0c;并对比TLS 1.2与TLS 1.3的差异&#xff1a; 一、TLS握手的核心目标 协商协议版本&#xff1a;确定双方支…...

libmemcached库api接口讲解三

前言&#xff1a;讲解一下如何删除数据 &#x1f5d1;️ libmemcached 删除键操作教程&#xff1a;memcached_delete() / memcached_delete_by_key() &#x1f4d8; 1. 函数作用 用于从 Memcached 中删除指定的 key&#xff0c;包括&#xff1a; memcached_delete()&#xff…...

注解和 XML 两种方式有什么区别?

注解和 XML 是两种常见的配置方式&#xff08;尤其在 Java 开发中&#xff0c;如 Spring 框架&#xff09;&#xff0c;它们的主要区别体现在配置方式、代码耦合性、可读性、维护性等方面。以下是两者的对比&#xff1a; 1. 配置方式 注解&#xff08;Annotation&#xff09; 在…...

[论文阅读]Formalizing and Benchmarking Prompt Injection Attacks and Defenses

Formalizing and Benchmarking Prompt Injection Attacks and Defenses Formalizing and Benchmarking Prompt Injection Attacks and Defenses | USENIX 33rd USENIX Security Symposium (USENIX Security 24) 提出了一个框架来形式化提示注入攻击&#xff0c;对提示注入攻击…...

分布式2(限流算法、分布式一致性算法、Zookeeper )

目录 限流算法 固定窗口计数器&#xff08;Fixed Window Counter&#xff09; 滑动窗口计数器&#xff08;Sliding Window Counter&#xff09; 漏桶算法&#xff08;Leaky Bucket&#xff09; 令牌桶算法&#xff08;Token Bucket&#xff09; 令牌桶与漏桶的对比 分布式…...

阿里端到端多模态语音对话开源模型论文速读:Qwen2.5-Omni

Qwen2.5-Omni 技术报告 1. 介绍 Qwen2.5-Omni 技术报告介绍了一个先进的端到端多模态模型 Qwen2.5-Omni&#xff0c;该模型能够感知包括文本、图像、音频和视频在内的多种模态&#xff0c;并能同时以流式方式生成文本和自然语音响应。该模型解决了统一不同理解模态、管理不同…...

React 第四十节 React Router 中 useBeforeUnload的使用详细解析及案例说明

useBeforeUnload 是 React Router 提供的一个自定义钩子&#xff0c;用于在用户尝试关闭页面、刷新页面或导航到外部网站时触发浏览器原生的确认提示。 它的核心用途是防止用户意外离开页面导致数据丢失&#xff08;例如未保存的表单内容&#xff09;。 一、useBeforeUnload 核…...

c++STL——哈希表封装:实现高效unordered_map与unordered_set

文章目录 用哈希表封装unordered_map和unordered_set改进底层框架迭代器实现实现思路迭代器框架迭代器重载operator哈希表中获取迭代器位置 哈希表的默认成员函数修改后的哈希表的代码封装至上层容器 用哈希表封装unordered_map和unordered_set 在前面我们已经学过如何实现哈希…...

通过迁移学习改进深度学习模型

在 ArcGIS Living Atlas of the World &#xff08;Browse | ArcGIS Living Atlas of the World&#xff09;中&#xff0c;可以下载能够分类或检测影像中要素的预训练深度学习模型。 深度学习模型在与用于训练模型的原始影像十分相似的影像上运行效果最好。 如果您所拥有的影像…...

SpringAI更新:废弃tools方法、正式支持DeepSeek!

AI 技术发展很快&#xff0c;同样 AI 配套的相关技术发展也很快。这不今天刚打开 Spring AI 的官网就发现它又又又又更新了&#xff0c;而这次更新距离上次更新 M7 版本才不过半个月的时间&#xff0c;那这次 Spring AI 给我们带来了哪些惊喜呢&#xff1f;一起来看。 重点升级…...

输入一个正整数,将其各位数字倒序输出(如输入123,输出321)

之前的解法&#xff1a; 这种方法仅支持三位数。 学了while之后&#xff0c;可以利用循环解决。 这种方法动态构建逆序数&#xff0c;支持任意长度的正整数。...

react+html2canvas+jspdf将页面导出pdf

主要使用html2canvasjspdf 1.将前端页面导出为pdf 2.处理导出后图表的截断问题 export default function AIReport() {const handleExport async () > {try {// 需要导出的内容idconst element document.querySelector(#AI-REPORT-CONTAINER);if (!element) {message.err…...

Spring Boot 自动装配技术方案书

Spring Boot 自动装配技术方案书(增强版) 一、Spring Boot 自动装配体系全景解析 1.1 核心设计理念 “约定优于配置”:通过合理的默认配置减少开发工作量“即插即用”:通过标准化扩展机制实现组件自动集成“分层解耦”:业务代码与基础设施分离,通过SPI机制实现扩展二、组…...

面试--HTML

1.src和href的区别 总结来说&#xff1a; <font style"color:rgb(238, 39, 70);background-color:rgb(249, 241, 219);">src</font>用于替换当前元素&#xff0c;指向的资源会嵌入到文档中&#xff0c;例如脚本、图像、框架等。<font style"co…...

(3)python开发经验

文章目录 1 sender返回对象找不到函数2 获取绝对路径3 指定翻译字符 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 sender返回对象找不到函数 在PySide6中多个信号绑定一个槽函数&#xff0c;使…...

机密虚拟机的威胁模型

本文将介绍近年兴起的机密虚拟机&#xff08;Confidential Virtual Machine&#xff09;技术所旨在抵御的威胁模型&#xff0c;主要关注内存机密性&#xff08;confidentiality&#xff09;和内存完整性&#xff08;integrity&#xff09;两个方面。在解释该威胁可能造成的问题…...