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

python三方库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 模型动态地创建数据库表结构。

相关文章:

python三方库sqlalchemy

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

【SSL部署与优化​】​​如何为网站启用HTTPS:从Let‘s Encrypt免费证书到Nginx配置​​

网站启用HTTPS 的完整实战指南&#xff0c;涵盖从 Let’s Encrypt 免费证书申请到 Nginx 配置的详细步骤&#xff0c;包括重定向、HSTS 设置及常见问题排查&#xff1a; 一、准备工作 1. 确保域名解析正确 • 在 DNS 管理后台&#xff0c;将域名&#xff08;如 example.com&…...

Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

电商平台自动化

为什么要进行独立站自动化 纯人工测试人力成本高&#xff0c;相对效率低 回归测试在通用模块重复进行人工测试&#xff0c;测试效率低 前期调研备选自动化框架&#xff08;工具&#xff09;&#xff1a; Katalon Applitools Testim 阿里云EMAS Playwright Appium Cypress 相关…...

【kafka】kafka概念,使用技巧go示例

1. Kafka基础概念 1.1 什么是Kafka&#xff1f; Kafka是一个分布式流处理平台&#xff0c;用于构建实时数据管道和流式应用。核心特点&#xff1a; 高吞吐量&#xff1a;每秒可处理百万级消息持久化存储&#xff1a;消息按Topic分区存储在磁盘分布式架构&#xff1a;支持水平…...

计算机系统结构——Cache性能分析

一、实验目的 加深对Cache的基本概念、基本组织结构以及基本工作原理的理解。掌握Cache容量、相联度、块大小对Cache性能的影响。掌握降低Cache不命中率的各种方法以及这些方法对提高Cache性能的好处。理解LRU与随机法的基本思想以及它们对Cache性能的影响。 二、实验平台 实…...

Spring Web MVC————入门(2)

1&#xff0c;请求 我们接下来继续讲请求的部分&#xff0c;上期将过很多了&#xff0c;我们来给请求收个尾。 还记得Cookie和Seesion吗&#xff0c;我们在HTTP讲请求和响应报文的时候讲过&#xff0c;现在再给大家讲一遍&#xff0c;我们HTTP是无状态的协议&#xff0c;这次的…...

Adobe DC 2025安装教程

一.软件下载 点此下载 二.软件安装...

W1电力线载波通信技术

CK_Label_W1 产品型号&#xff1a;CK_Label_W1 尺寸&#xff1a;37*65*33.7mm 按键&#xff1a;1 指示灯&#xff1a;1 RGB灯(红/绿/蓝/黄/紫/白/青) 外观颜色&#xff1a;白色 合规认证&#xff1a;CE, RoHS 工作温度&#xff1a;0-50℃ 提示功能&#xff1a;蜂鸣器声音…...

现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析

现代 Web 自动化测试框架对比&#xff1a;Playwright 与 Selenium 的深度剖析 摘要&#xff1a;本文对 Playwright 与 Selenium 在开发适配性、使用难度、场景适用性及性能表现等方面进行了全面深入的对比分析。通过详细的技术实现细节阐述与实测数据支撑&#xff0c;为开发者…...

第二章:CSS秘典 · 色彩与布局的力量

剧情承接&#xff1a;色彩失衡的荒原 林昊穿过 HTML 大门&#xff0c;眼前却是一片 灰白扭曲的荒原。所有页面元素如同幽灵般漂浮&#xff0c;没有色彩、没有结构&#xff0c;错乱无章。 “这是失控的样式荒原。” 零号导师的声音再次响起&#xff0c; “HTML 给了你骨架&…...

ubuntu studio 系统详解

Ubuntu Studio 系统详解&#xff1a;面向多媒体创作的专业 Linux 发行版 一、定位与目标用户 Ubuntu Studio 是 Ubuntu 的官方衍生版本&#xff08;Flavor&#xff09;&#xff0c;专为 音频、视频、图形设计、音乐制作、影视后期 等多媒体创作场景设计。目标用户包括&#x…...

在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1

在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1&#xff0c;可以通过以下步骤完成&#xff1a; 方法 1&#xff1a;使用 pip 安装&#xff08;推荐&#xff09; 步骤 1&#xff1a;卸载旧版本 SCons # 如果通过 apt 安装的旧版本&#xff0c;先卸载 sudo apt remov…...

边缘计算网关工业物联网应用:空压机远程运维监控管理

边缘计算网关在空压机远程运维监控管理中的工业物联网应用&#xff0c;主要体现在数据采集与处理、设备监控、故障诊断与预警、远程控制等方面&#xff0c;以下是具体介绍&#xff1a; 数据采集与处理 多源数据采集&#xff1a;边缘计算网关能连接空压机的各类传感器&#xf…...

【大模型面试每日一题】Day 18:大模型中KV Cache的作用是什么?如何通过Window Attention优化其内存占用?

【大模型面试每日一题】Day 18&#xff1a;大模型中KV Cache的作用是什么&#xff1f;如何通过Window Attention优化其内存占用&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官:大模型中KV Cache的作用是什么&#xff1f;如何通过Window Attention优…...

Spring的 @Validate注解详细分析

在 Spring Boot 中&#xff0c;参数校验是保证数据合法性的重要手段。除了前面提到的NotNull、Size等基础注解外&#xff0c;JSR-303&#xff08;Bean Validation 1.0&#xff09;、JSR-349&#xff08;Bean Validation 1.1&#xff09;和 JSR-380&#xff08;Bean Validation …...

现代计算机图形学Games101入门笔记(三)

三维变换 具体形式缩放&#xff0c;平移 特殊点旋转。这里涉及到坐标系&#xff0c;先统一定义右手坐标系&#xff0c;根据叉乘和右手螺旋判定方向。这里还能法线Ry Sina 正负与其他两个旋转不一样。这里可以用右手螺旋&#xff0c;x叉乘z&#xff0c;发现大拇指朝下&#xff0…...

AI时代的弯道超车之第八章:具体分享几个AI实际操作方法和案例

在这个AI重塑世界的时代,你还在原地观望吗?是时候弯道超车,抢占先机了! 李尚龙倾力打造——《AI时代的弯道超车:用人工智能逆袭人生》专栏,带你系统掌握AI知识,从入门到实战,全方位提升认知与竞争力! 内容亮点: AI基础 + 核心技术讲解 职场赋能 + 创业路径揭秘 打破…...

企业网络新选择:软件定义架构下的MPLS

随着现代企业园区网络和运营商级基础设施的不断发展&#xff0c;多协议标签交换 &#xff08;MPLS&#xff09; 已成为一项基础技术&#xff0c;这要归功于其高效的数据包转发、高级流量工程功能以及对多租户环境的强大支持。 什么是MPLS&#xff1f; MPLS&#xff08;多协议…...

SparkSQL操作Mysql

&#xff08;一&#xff09;准备mysql环境 我们计划在hadoop001这台设备上安装mysql服务器&#xff0c;&#xff08;当然也可以重新使用一台全新的虚拟机&#xff09;。 以下是具体步骤&#xff1a; 使用finalshell连接hadoop001.查看是否已安装MySQL。命令是: rpm -qa|grep…...

【论文阅读】UNIT: Backdoor Mitigation via Automated Neural Distribution Tightening

ECCV2024 https://github.com/Megum1/UNIT 我们的主要贡献总结如下&#xff1a; 我们引入了UNIT&#xff08;“AUtomated Neural DIstribution Tightening”&#xff09;&#xff0c;这是一种创新的后门缓解方法&#xff0c;它为每个神经元近似独特的分布边界&#xff0c;用于…...

Android逆向学习(十) IDA逆向编辑Android so文件

Android逆向学习&#xff08;十&#xff09; IDA逆向编辑Android so文件 一、 写在前面 这是吾爱破解论坛正己大大的第10个教程 native code在我之前的博客中讲到过&#xff0c;所以这里就不讲了 简单来说&#xff0c;native code就是在android中使用c或c语言进行开发 这样…...

OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的远程控制软件设计方案

以下是基于 OpenCV PyAutoGUI Tkinter FastAPI Requests 实现的远程控制软件设计方案。该方案分为 被控端&#xff08;服务端&#xff09; 和 控制端&#xff08;客户端&#xff09;&#xff0c;支持屏幕实时查看、键盘映射和鼠标操作。 1. 系统架构 ------------------- …...

C++.神经网络与深度学习(赶工版)(会二次修改)

神经网络与深度学习 1. 神经网络基础1.1 神经元模型与激活函数1.2 神经网络结构与前向传播2.1 损失函数与优化算法均方误差损失函数交叉熵损失函数梯度下降优化算法 2.2 反向传播与梯度计算神经元的反向传播 3.1 神经元类设计与实现神经元类代码实现代码思路 3.2 神经网络类构建…...

砷化镓太阳能电池:开启多元领域能源新篇

砷化镓太阳能电池作为一种高性能的光伏产品&#xff0c;具有诸多独特优势。其中&#xff0c;锗衬底砷化镓太阳能电池表现尤为突出&#xff0c;它具备高转化效率、耐辐照和高电压等特性。在空间供电电源领域&#xff0c;这些优势使其成为人造卫星、太空站、太空探测器和登陆探测…...

[Linux] vim及gcc工具

目录 一、vim 1.vim的模式 2.vim的命令集 (1):命令模式 (2):底行模式 3.vim配置 二、gcc 1.gcc格式及选项 2.工作布置 三、自动化构建工具makefile 1.基本使用方法 2.配置文件解析 3.拓展 在linux操作系统的常用工具中&#xff0c;常用vim来进行程序的编写&#xff1b…...

java加强 -stream流

Stream流是jdk8开始新增的一套api&#xff0c;可以用于操作集合或数组的内容。 Stream流大量的结合了Lambda的语法风格来编程&#xff0c;功能强大&#xff0c;性能高效&#xff0c;代码简洁&#xff0c;可读性好。 体验Stream流 把集合中所有以三开头并且三个字的元素存储到…...

RHCE认证通过率

红帽RHCE考试总体通过率38%&#xff08;2023年数据&#xff09;&#xff0c;细分数据显示自学者通过率18%&#xff0c;参加官方培训者47%&#xff0c;企业团体考生53%。通过率差异由备考资源和考试策略决定。 RHCE考试重点考Ansible自动化运维&#xff0c;需在3.5小时内完成12…...

OpenEvidence AI临床决策支持工具平台研究报告

平台概述 OpenEvidence是一个专为医疗专业人士设计的临床决策支持工具,旨在通过整合各类临床计算器和先进的人工智能技术,提高医生的诊疗决策效率和准确性。作为一款综合性医疗平台,OpenEvidence将复杂的医学计算流程简化,同时提供个性化的临床建议,使医生能够更快、更准…...

gd32e230c8t6 keil6工程模板

下载固件gd32e230c8t6固件官方下载&#xff08;需登录&#xff09; 或 蓝奏云 新建一个文件夹&#xff0c;把固件压缩包里的里的Firmware和Template拖进去 keil新建gd32e230c8工程 必须勾选CMSIS-CORE 新建一个文件夹&#xff0c;双击任意改名 点击manage project it…...

正向代理与反向代理区别及应用

正向代理和反向代理是两种常见的代理服务器类型&#xff0c;它们在网络架构中扮演不同角色&#xff0c;核心区别在于代理对象和使用场景。 1. 正向代理&#xff08;Forward Proxy&#xff09; 定义&#xff1a;正向代理是客户端&#xff08;如浏览器&#xff09;主动配置的代理…...

自然语言处理入门级项目——文本分类

文章目录 前言1.数据预处理1.1数据集介绍1.2数据集抽取1.3划分数据集1.4数据清洗1.5数据保存 2.样本的向量化表征2.1词汇表2.2向量化2.3自定义数据集2.4备注 结语 前言 本篇博客主要介绍自然语言处理领域中一个项目案例——文本分类&#xff0c;具体而言就是判断评价属于积极还…...

UOS专业版上通过源码安装 Python 3.13 并保留系统默认版本

在 UOS 专业版上通过源码安装 Python 3.13 并保留系统默认版本&#xff0c;可按照以下步骤操作&#xff1a; 1. 安装依赖 首先安装编译 Python 所需的依赖库&#xff1a; sudo apt update sudo apt install -y build-essential zlib1g-dev libncurses5-dev \ libgdbm-dev li…...

【论文笔记】ViT-CoMer

【题目】&#xff1a;ViT-CoMer: Vision Transformer with Convolutional Multi-scale Feature Interaction for Dense Predictions 【引用格式】&#xff1a;Xia C, Wang X, Lv F, et al. Vit-comer: Vision transformer with convolutional multi-scale feature interaction…...

kaggle薅羊毛

参考&#xff1a;https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter05_application/5_1_kaggle/#512-kaggle https://github.com/girls-in-ai/Girls-In-AI/blob/master/machine_learning_diary/data_analysis/kaggle_intro.md 1&#xff0c;code training…...

Python 之 Flask 入门学习

安装 Flask 在开始使用 Flask 之前&#xff0c;需要先安装它。可以通过 pip 命令来安装 Flask&#xff1a; pip install Flask创建第一个 Flask 应用 创建一个简单的 Flask 应用&#xff0c;只需要几行代码。以下是一个最基本的 Flask 应用示例&#xff1a; from flask imp…...

SpringBoot Vue MySQL酒店民宿预订系统源码(支付宝沙箱支付)+代码讲解视频

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

Oracle日期计算跟Mysql计算日期差距问题-导致两边计算不一致

Oracle数据库对日期做加法时&#xff0c;得到的时间是某天的12:00:00 例&#xff1a; Oracle计算 select (TO_DATE(2025-04-14, YYYY-MM-DD)1.5*365) from dual; 结果&#xff1a;2026/10/13 12:00:00Mysql计算 select DATE_ADD( str_to_date( 2025-04-14, %Y-%m-%d ), INTER…...

多线程(三)

上一期关于线程的执行&#xff0c;咱们说到线程是 “ 随机调度&#xff0c;抢占式执行 ”。所以我们对于线程之间执行的先后顺序是难以预知的。 例如咱们打篮球的时候&#xff0c;球场上的每一位运动员都是一个独立的 “ 执行流 ”&#xff0c;也可以认为是一个线程&#xff0…...

微服务商城(1)开篇、服务划分

参考&#xff1a;https://mp.weixin.qq.com/s?__bizMzg2ODU1MTI0OA&mid2247485597&idx1&sn7e85894b7847cc50df51d66092792453&scene21#wechat_redirect 为什么选择go-zero go-zero 为我们提供了许多高并发场景下的实用工具&#xff0c;比如为了降低接口耗时…...

刘强东 “猪猪侠” 营销:重构创始人IP的符号革命|创客匠人热点评述

当刘强东身着印有外卖箱猪猪侠的 T 恤漫步东京涩谷街头时&#xff0c;这场看似荒诞的行为艺术实则揭开了互联网商业竞争的新篇章。这位曾经以严肃企业家形象示人的京东创始人&#xff0c;正通过二次元 IP 的深度绑定&#xff0c;完成从商业领袖到文化符号的华丽转身。 一、IP …...

MQ消息队列的深入研究

目录 1、Apache Kafka 1.1、 kafka架构设 1.2、最大特点 1.3、功能介绍 1.4、Broker数据共享 1.5、数据一致性 2、RabbitMQ 2.1、架构图 2.2、最大特点 2.3、工作原理 2.4、功能介绍 3、RocketMQ 3.1、 架构设计 3.2、工作原理 3.3、最大特点 3.4、功能介绍 3…...

填涂颜色(bfs)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 含泪播种的人一定能含笑收获! 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现…...

FFplay 音视频同步机制解析:以音频为基准的时间校准与动态帧调整策略

1.⾳视频同步基础 1.2 简介 看视频时&#xff0c;要是声音和画面不同步&#xff0c;体验会大打折扣。之所以会出现这种情况&#xff0c;和音视频数据的处理过程密切相关。音频和视频的输出不在同一个线程&#xff0c;就像两个工人在不同车间工作&#xff0c;而且不一定会同时…...

【Linux笔记】——进程信号的捕捉——从中断聊聊OS是怎么“活起来”的

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;【Linux笔记】——进程信号的保存 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、信号捕捉的流程二、…...

VCS X-PROP建模以及在方针中的应用

VCS X-PROP建模以及在方针中的应用 摘要&#xff1a;VCS X-Prop&#xff08;X-Propagation&#xff09;是 Synopsys VCS 仿真工具中的一种高级功能&#xff0c;用于增强 X 态&#xff08;未知态&#xff09;和 Z 态&#xff08;高阻态&#xff09;在 RTL 仿真中的建模和传播能力…...

OpenSHMEM 介绍和使用指南

OpenSHMEM 介绍和使用指南 什么是 OpenSHMEM&#xff1f; OpenSHMEM 是一个用于并行计算的标准化 API&#xff0c;它提供了一种分区全局地址空间 (PGAS) 编程模型。OpenSHMEM 最初由 Cray 公司开发&#xff0c;后来成为一个开源项目&#xff0c;旨在为高性能计算提供高效的通…...

Electron入门指南:用前端技术打造桌面应用

&#x1f31f; 目录速览 什么是Electron&#xff1f;为什么要用Electron&#xff1f;核心概念三分钟掌握快速创建第一个应用典型应用场景开发注意事项常见问题解答 一、什么是Electron&#xff1f;&#x1f914; Electron就像魔法转换器&#xff0c;它能将你熟悉的&#xff1…...

机器学习第十讲:异常值检测 → 发现身高填3米的不合理数据

机器学习第十讲&#xff1a;异常值检测 → 发现身高填3米的不合理数据 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 一、幼儿…...

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;导致请求直接穿透缓存到达数据库&#xff0c;给数据库带来压力的情况。 常见的解决方案有两种&#xff1a; 缓存空对象&#xff1a;实现简单&#xff0c;维护方便&am…...