惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

博客园 - 哥本哈士奇(aspnetx)

Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建 SQL Server RAG 笔记1:图数据库构建 Neo4j 笔记(四):一篇文章如何入库的 数据仓库笔记 第六篇:PSA 层 SCD2 处理方式 数据仓库笔记 第五篇:Data Mart 层(数据集市) 数据仓库笔记 第四篇:Star Schema 层(维度建模) 数据仓库笔记 第三篇:常用缓慢变化维处理方式介绍 数据仓库笔记 第二篇:PSA 层(持久化暂存区)详解 数据仓库笔记 第一篇:数据仓库的定义、历史与意义 Neo4j 笔记(三):数据建模与程序连接实战 Neo4j 基础教程(二):Cypher CRUD 完全指南 Neo4j 基础教程(一):安装与快速入门 Power BI学习笔记第20篇:面试题汇总 · 第三篇:高级应用与最佳实践篇 Power BI学习笔记第19篇:面试题汇总 · 第二篇:数据建模与 DAX 篇 Power BI学习笔记第18篇:面试题汇总 · 第一篇:基础概念篇 Power BI学习笔记第15篇:企业级报表开发与最佳实践 Power BI学习笔记第13篇:高级可视化与自定义图表 Power BI学习笔记第14篇:Power Query 高级数据处理 Power BI学习笔记第12篇:DAX 高级计算与性能优化 Power BI学习笔记第11篇:高级数据建模与关系设计 Power BI学习笔记第10篇:实战案例 — 销售数据分析仪表板 Power BI学习笔记第08篇:报表交互与筛选器 Power BI学习笔记第09篇:Power BI Service 发布与共享 Power BI学习笔记第07篇:可视化图表设计与最佳实践 Power BI学习笔记第06篇:DAX 进阶:时间智能与复杂计算 Power BI学习笔记第05篇:DAX 基础:计算列与度量值 Power BI学习笔记第04篇:数据建模与关系管理 Power BI学习笔记第03篇:Power Query 数据清洗与转换 Power BI学习笔记第02篇:数据获取与连接数据源 Power BI学习笔记第01篇:Power BI 简介与环境搭建 Power BI Dashboard 常用布局方案推荐 Power BI 示例一览 OpenClaw 核心八大 MD 文件 Microsoft Agent Framework 智能体调用工具 Microsoft Agent Framework 创建智能体 一个简单案例理解OpenClaw的做梦过程 LangChain RAG索引与查询 - 学习笔记 LangChain使用deep agent并且加载SKILL 本地系统对接大模型智能体的若干尝试 财务分析报告 - 常用Power BI DAX公式详解 用SKILL实现请假流程信息收集 使用小龙虾来操作猿编程的遥控车 使用OpenClaw的Skills对接本地系统 OpenClaw必装Skill全指南 Dify Agentic RAG 笔记 # 简单的神经网络计算过程 - 正负判断 使用Gradio构建AI前端 - RAG的QA模块 使用Gradio构建AI前端 - RAG召回测试 Streamlit + LangChain 1.0 简单实现智能问答前后端 利用AI Agent,辅助销售团队制定培训和考试内容 实现AI和BI整合的初步思路和探索-Part3 实现AI和BI整合的初步思路和探索-Part2 实现AI和BI整合的初步思路和探索 以《出师表》作为例子,对比通用分块和父子分块的区别 LangChain RAG 学习笔记:从文档加载到问答服务 记录无法修改OneDrive文件的解决方法 Power BI制作指标达成跟踪器 Power BI学习笔记-周报销售数据分析
SQLAlchemy 学习笔记
哥本哈士奇(aspnet · 2026-04-20 · via 博客园 - 哥本哈士奇(aspnetx)

SQLAlchemy 学习笔记

简介

突然发现最近好多Vibe Coding生成的技术方案都会用SQLAlchemy,所以编写了一个简单的code顺便拆解学习一下,特记录在此,方便后续知识回顾。
SQLAlchemy 是 Python 中最流行的 ORM(对象关系映射)库,它提供了一种将 Python 对象与数据库表结构映射的方式,使开发者能够使用面向对象的方式操作数据库,而不需要直接编写 SQL 语句。
总体感觉跟微软的LINQ to SQL有点像,但其有LINQ的特殊查询语言,而在SQLAlchemy下则都是通过类和方法来操作。

核心组件

以下是使用SQLAlchemy需要用到的核心组件:

  • Engine:数据库引擎,负责与数据库建立连接
  • Base:所有模型类的基类
  • Session:会话,用于执行数据库操作
  • Model:数据模型,对应数据库中的表
  • Query:查询对象,用于构建和执行数据库查询

环境搭建

安装 SQLAlchemy

pip3 install sqlalchemy

导入必要的模块

from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.orm import declarative_base, sessionmaker

数据库连接

创建数据库引擎

# 创建SQLite数据库引擎
engine = create_engine('sqlite:///products.db', echo=False)
  • sqlite:///products.db:SQLite 数据库连接字符串,指定数据库文件路径
  • echo=False:是否打印 SQL 语句,开发时可以设置为 True 以便调试

支持的数据库类型

不同数据库的连接字符串:

  • SQLite:sqlite:///database.db
  • MySQL:mysql://username:password@host:port/database
  • PostgreSQL:postgresql://username:password@host:port/database
  • Oracle:oracle://username:password@host:port/database

数据模型定义

创建基类

# 创建基类
Base = declarative_base()

定义模型类

# 定义Product模型
class Product(Base):
    __tablename__ = 'products'  # 表名
    
    id = Column(Integer, primary_key=True, autoincrement=True)  # 主键,自增
    name = Column(String(100), nullable=False)  # 产品名称,非空
    price = Column(Float, nullable=False)  # 产品价格,非空
    category = Column(String(50), nullable=False)  # 产品类别,非空

可以看到,通过SQL检表的方法在SQLAlchemy都有对应的实现。

字段类型

跟常用数据库里的数据类型都有相应的类型对应。

  • Integer:整数
  • String:字符串,可指定长度
  • Float:浮点数
  • Boolean:布尔值
  • DateTime:日期时间
  • Date:日期
  • Time:时间
  • Text:长文本

字段参数

  • primary_key:是否为主键
  • autoincrement:是否自增
  • nullable:是否允许为空
  • default:默认值
  • unique:是否唯一
  • index:是否创建索引

数据表创建

# 创建数据表
Base.metadata.create_all(engine)
  • 这行代码会自动创建所有继承自 Base 的模型对应的表结构
  • 如果表已经存在,则不会重复创建

会话管理

创建会话工厂

# 创建会话工厂
Session = sessionmaker(bind=engine)

创建会话实例

# 在类中创建会话实例
def __init__(self):
    self.session = Session()

6.3 关闭会话

def close(self):
    """关闭会话"""
    self.session.close()

CRUD 操作

创建(Create)

def create(self, name, price, category):
    """创建新产品"""
    product = Product(name=name, price=price, category=category)
    self.session.add(product)  # 添加到会话
    self.session.commit()  # 提交事务
    return product

读取(Read)

读取所有数据

def read_all(self):
    """读取所有产品"""
    return self.session.query(Product).all()

根据 ID 读取

def read_by_id(self, product_id):
    """根据ID读取产品"""
    return self.session.query(Product).filter_by(id=product_id).first()

更新(Update)

def update(self, product_id, name=None, price=None, category=None):
    """更新产品信息"""
    product = self.read_by_id(product_id)
    if product:
        if name:
            product.name = name
        if price:
            product.price = price
        if category:
            product.category = category
        self.session.commit()  # 提交事务
        return product
    return None

删除(Delete)

根据 ID 删除

def delete(self, product_id):
    """删除产品"""
    product = self.read_by_id(product_id)
    if product:
        self.session.delete(product)  # 从会话中删除
        self.session.commit()  # 提交事务
        return True
    return False

根据名称删除

def delete_by_name(self, product_name):
    """根据产品名字删除产品"""
    product = self.session.query(Product).filter_by(name=product_name).first()
    if product:
        self.session.delete(product)
        self.session.commit()
        return True
    return False

查询方法

基本查询

  • query(Model):创建查询对象
  • all():返回所有结果
  • first():返回第一个结果
  • filter_by(**kwargs):根据条件过滤
  • filter(condition):使用更复杂的条件过滤
  • order_by(column):排序
  • limit(n):限制返回数量
  • offset(n):偏移量

示例

# 查询所有产品
products = session.query(Product).all()

# 根据条件查询
product = session.query(Product).filter_by(name="iPhone 15").first()

# 复杂条件查询
products = session.query(Product).filter(Product.price > 5000).all()

# 排序
products = session.query(Product).order_by(Product.price.desc()).all()

# 限制数量
products = session.query(Product).limit(10).all()

事务管理

提交和回滚事务

self.session.commit()
self.session.rollback()

上下文管理器

with Session() as session:
    try:
        # 执行操作
        session.commit()
    except Exception:
        session.rollback()
        raise

完整示例

以下是一个完整的 SQLAlchemy 使用示例,包含了模型定义、CRUD 操作和测试代码:

from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.orm import declarative_base, sessionmaker

# 创建SQLite数据库引擎
engine = create_engine('sqlite:///products.db', echo=False)

# 创建基类
Base = declarative_base()

# 定义Product模型
class Product(Base):
    __tablename__ = 'products'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100), nullable=False)
    price = Column(Float, nullable=False)
    category = Column(String(50), nullable=False)

# 创建数据表
Base.metadata.create_all(engine)

# 创建会话工厂
Session = sessionmaker(bind=engine)

# CRUD操作类
class ProductCRUD:
    def __init__(self):
        self.session = Session()
    
    def create(self, name, price, category):
        """创建新产品"""
        product = Product(name=name, price=price, category=category)
        self.session.add(product)
        self.session.commit()
        return product
    
    def read_all(self):
        """读取所有产品"""
        return self.session.query(Product).all()
    
    def read_by_id(self, product_id):
        """根据ID读取产品"""
        return self.session.query(Product).filter_by(id=product_id).first()
    
    def update(self, product_id, name=None, price=None, category=None):
        """更新产品信息"""
        product = self.read_by_id(product_id)
        if product:
            if name:
                product.name = name
            if price:
                product.price = price
            if category:
                product.category = category
            self.session.commit()
            return product
        return None
    
    def delete(self, product_id):
        """删除产品"""
        product = self.read_by_id(product_id)
        if product:
            self.session.delete(product)
            self.session.commit()
            return True
        return False
    
    def delete_by_name(self, product_name):
        """根据产品名字删除产品"""
        product = self.session.query(Product).filter_by(name=product_name).first()
        if product:
            self.session.delete(product)
            self.session.commit()
            return True
        return False
    
    def close(self):
        """关闭会话"""
        self.session.close()

# 测试代码
if __name__ == "__main__":
    crud = ProductCRUD()
    
    # 创建测试数据
    print("创建测试数据...")    
    crud.create("iPhone 15", 7999.99, "电子产品")
    crud.create("MacBook Pro", 12999.99, "电子产品")
    crud.create("AirPods Pro", 1999.99, "电子产品")
    
    # 读取所有产品
    print("\n读取所有产品:")
    products = crud.read_all()
    for product in products:
        print(f"ID: {product.id}, 名称: {product.name}, 价格: {product.price}, 类别: {product.category}")
    
    # 根据ID读取产品
    print("\n根据ID读取产品:")
    product = crud.read_by_id(1)
    if product:
        print(f"ID: {product.id}, 名称: {product.name}, 价格: {product.price}, 类别: {product.category}")
    
    # 更新产品
    print("\n更新产品:")
    updated_product = crud.update(1, price=8999.99)
    if updated_product:
        print(f"更新后: ID: {updated_product.id}, 名称: {updated_product.name}, 价格: {updated_product.price}, 类别: {updated_product.category}")
    
    # 删除产品
    print("\n删除产品:")
    result = crud.delete(3)
    print(f"根据ID删除结果: {'成功' if result else '失败'}")
    
    # 根据产品名字删除
    print("\n根据产品名字删除:")
    result = crud.delete_by_name("AirPods Pro")
    print(f"根据名字删除结果: {'成功' if result else '失败'}")
    
    # 再次读取所有产品
    print("\n删除后读取所有产品:")
    products = crud.read_all()
    for product in products:
        print(f"ID: {product.id}, 名称: {product.name}, 价格: {product.price}, 类别: {product.category}")
    
    # 关闭会话
    crud.close()

总结

SQLAlchemy 是一个功能强大的 ORM 库,它提供了一种优雅的方式来操作数据库。通过本文可以快速的回顾:

  1. 理解 SQLAlchemy 的核心概念和组件
  2. 定义数据模型并创建数据表
  3. 执行基本的 CRUD 操作
  4. 使用各种查询方法
  5. 管理事务
  6. 遵循最佳实践

SQLAlchemy 不仅简化了数据库操作,还提高了代码的可维护性和可扩展性,是 Python 开发中处理数据库的首选工具之一。

相比LINQ的方式,微软在IDE里可以通过拖拽的方式来完成ORM的映射,很是方便。SQLAlchemy也有类似的第三方库可以实现,但目前有一个更好的方法就是通过AI来实现,效率会高很多。