用Python生成艺术:分形与算法绘图
SQLAlchemy是Python中最流行的ORM对象关系映射框架之一它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操作事务管理最佳实践安装bashpip install sqlalchemy如果需要连接特定数据库还需安装相应的驱动程序bash# PostgreSQL pip install psycopg2-binary # MySQL pip install mysql-connector-python # SQLite (Python标准库已包含无需额外安装)核心概念Engine数据库连接的引擎负责与数据库通信Session数据库会话管理所有持久化操作Model数据模型类对应数据库中的表Query查询对象用于构建和执行数据库查询连接数据库pythonfrom sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建数据库连接引擎 # SQLite示例 engine create_engine(sqlite:///example.db, echoTrue) # PostgreSQL示例 # engine create_engine(postgresql://username:passwordlocalhost:5432/mydatabase) # MySQL示例 # engine create_engine(mysqlmysqlconnector://username:passwordlocalhost:3306/mydatabase) # 创建会话工厂 SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindengine) # 创建会话实例 session SessionLocal()定义数据模型pythonfrom sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship, declarative_base # 创建基类 Base declarative_base() class User(Base): __tablename__ users id Column(Integer, primary_keyTrue, indexTrue) name Column(String(50), nullableFalse) email Column(String(100), uniqueTrue, indexTrue) # 定义一对多关系 posts relationship(Post, back_populatesauthor) class Post(Base): __tablename__ posts id Column(Integer, primary_keyTrue, indexTrue) title Column(String(100), nullableFalse) content Column(String(500)) author_id Column(Integer, ForeignKey(users.id)) # 定义多对一关系 author relationship(User, back_populatesposts) # 定义多对多关系通过关联表 tags relationship(Tag, secondarypost_tags, back_populatesposts) class Tag(Base): __tablename__ tags id Column(Integer, primary_keyTrue, indexTrue) name Column(String(30), uniqueTrue, nullableFalse) posts relationship(Post, secondarypost_tags, back_populatestags) # 关联表用于多对多关系 class PostTag(Base): __tablename__ post_tags post_id Column(Integer, ForeignKey(posts.id), primary_keyTrue) tag_id Column(Integer, ForeignKey(tags.id), primary_keyTrue)创建数据库表python# 创建所有表 Base.metadata.create_all(bindengine) # 删除所有表 # Base.metadata.drop_all(bindengine)基本CRUD操作创建数据python# 创建新用户 new_user User(name张三, emailzhangsanexample.com) session.add(new_user) session.commit() # 批量创建 session.add_all([ User(name李四, emaillisiexample.com), User(name王五, emailwangwuexample.com) ]) session.commit()读取数据python# 获取所有用户 users session.query(User).all() # 获取第一个用户 first_user session.query(User).first() # 根据ID获取用户 user session.query(User).get(1)更新数据python# 查询并更新 user session.query(User).get(1) user.name 张三四 session.commit() # 批量更新 session.query(User).filter(User.name.like(张%)).update({name: 张氏}, synchronize_sessionFalse) session.commit()删除数据python# 查询并删除 user session.query(User).get(1) session.delete(user) session.commit() # 批量删除 session.query(User).filter(User.name 李四).delete(synchronize_sessionFalse) session.commit()查询数据基本查询python# 获取所有记录 users session.query(User).all() # 获取特定字段 names session.query(User.name).all() # 排序 users session.query(User).order_by(User.name.desc()).all() # 限制结果数量 users session.query(User).limit(10).all() # 偏移量 users session.query(User).offset(5).limit(10).all()过滤查询pythonfrom sqlalchemy import or_ # 等值过滤 user session.query(User).filter(User.name 张三).first() # 模糊查询 users session.query(User).filter(User.name.like(张%)).all() # IN查询 users session.query(User).filter(User.name.in_([张三, 李四])).all() # 多条件查询 users session.query(User).filter( User.name 张三, User.email.like(%example.com) ).all() # 或条件 users session.query(User).filter( or_(User.name 张三, User.name 李四) ).all() # 不等于 users session.query(User).filter(User.name ! 张三).all()聚合查询pythonfrom sqlalchemy import func # 计数 count session.query(User).count() # 分组计数 user_post_count session.query( User.name, func.count(Post.id) ).join(Post).group_by(User.name).all() # 求和、平均值等 avg_id session.query(func.avg(User.id)).scalar()连接查询python# 内连接 results session.query(User, Post).join(Post).filter(Post.title.like(%Python%)).all() # 左外连接 results session.query(User, Post).outerjoin(Post).all() # 指定连接条件 results session.query(User, Post).join(Post, User.id Post.author_id).all()关系操作python# 创建带关系的对象 user User(name赵六, emailzhaoliuexample.com) post Post(title我的第一篇博客, contentHello World!, authoruser) session.add(post) session.commit() # 通过关系访问 print(f文章 {post.title} 的作者是 {post.author.name}) print(f用户 {user.name} 的所有文章:) for p in user.posts: print(f - {p.title}) # 多对多关系操作 python_tag Tag(namePython) sqlalchemy_tag Tag(nameSQLAlchemy) post.tags.append(python_tag) post.tags.append(sqlalchemy_tag) session.commit() print(f文章 {post.title} 的标签:) for tag in post.tags: print(f - {tag.name})事务管理python# 自动提交事务 try: user User(name测试用户, emailtestexample.com) session.add(user) session.commit() except Exception as e: session.rollback() print(f发生错误: {e}) # 使用事务上下文管理器 from sqlalchemy.orm import Session def create_user(session: Session, name: str, email: str): try: user User(namename, emailemail) session.add(user) session.commit() return user except: session.rollback() raise # 嵌套事务 with session.begin_nested(): user User(name事务用户, emailtransactionexample.com) session.add(user) # 保存点 savepoint session.begin_nested() try: user User(name保存点用户, emailsavepointexample.com) session.add(user) savepoint.commit() except: savepoint.rollback()最佳实践会话管理为每个请求创建新会话请求结束后关闭异常处理始终处理异常并适当回滚事务延迟加载注意N1查询问题使用 eager loading 优化连接池合理配置连接池大小和超时设置数据验证在模型层或应用层验证数据完整性python# 使用上下文管理器管理会话 from contextlib import contextmanager contextmanager def get_db(): db SessionLocal() try: yield db db.commit() except Exception: db.rollback() raise finally: db.close() # 使用示例 with get_db() as db: user User(name上下文用户, emailcontextexample.com) db.add(user)总结SQLAlchemy ORM提供了强大而灵活的数据库操作方式通过本文的介绍您应该能够安装和配置SQLAlchemy定义数据模型和关系执行基本的CRUD操作构建复杂查询管理数据库事务遵循最佳实践SQLAlchemy还有更多高级特性如混合属性、事件监听、自定义查询等值得进一步探索学习。

相关新闻

HarmonyOS 游戏里的“假异步”,为什么会卡

HarmonyOS 游戏里的“假异步”,为什么会卡

子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…

2026/7/2 19:32:40 阅读更多 →
AI大模型应用开发工程师:技术与产业的“翻译官“,月薪可达60k的热门职业

AI大模型应用开发工程师:技术与产业的“翻译官“,月薪可达60k的热门职业

AI大模型应用开发工程师是连接技术与产业的关键桥梁,负责将复杂AI大模型转化为实用产品。其核心职责包括需求分析、技术选型、应用开发、测试优化及部署运维。随着AI技术加速落地,这种"技术业务"的复合型人才备受市场青睐,月薪最高…

2026/7/4 23:10:53 阅读更多 →
【课程设计/毕业设计】基于Spring Boot的学生信息管理系统基于springboot的高校院系学生信息管理系统【附源码、数据库、万字文档】

【课程设计/毕业设计】基于Spring Boot的学生信息管理系统基于springboot的高校院系学生信息管理系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/4 18:09:13 阅读更多 →

最新新闻

基于Playwright与MCP协议实现浏览器自动化与手动操作协同

基于Playwright与MCP协议实现浏览器自动化与手动操作协同

1. 项目概述:当自动化脚本遇上你的手动操作在浏览器自动化测试和爬虫开发的日常里,我们常常面临一个尴尬的割裂:一边是精心编写的Playwright脚本,在无头模式下高效、稳定地执行任务;另一边,则是我们自己手动…

2026/7/4 23:39:21 阅读更多 →
通过COM组件在Web上实现Kinect骨骼追踪、声控截屏保存的功能

通过COM组件在Web上实现Kinect骨骼追踪、声控截屏保存的功能

具体实现 第一部分 ActiveX插件的实现 1) 创建一个新的解决方案,叫做MyFirstKinect。 2)接着创建一个Windows窗体控件库,用于做ActiveX的插件,项目叫做MyFirstKinectControl 3)在MyFirstKinectControl项目…

2026/7/4 23:39:21 阅读更多 →
Coze平台AI Agent开发实战与优化技巧

Coze平台AI Agent开发实战与优化技巧

1. Coze平台与AI Agent开发概述作为一名长期从事AI应用开发的工程师,我最近深度体验了Coze平台在AI Agent开发中的实际表现。这个由字节跳动推出的开发平台确实为不同技术背景的用户提供了一种全新的AI应用构建方式。与传统开发模式相比,Coze最显著的特点…

2026/7/4 23:39:21 阅读更多 →
机器学习模型线上稳定性实战:特征一致性、数据漂移与推理容错

机器学习模型线上稳定性实战:特征一致性、数据漂移与推理容错

1. 这不是“跑通模型”就完事的课——它讲的是模型怎么在真实业务里活下来“From Notebook to Production: Running ML in the Real World (Part 4)”这个标题,光看前半句,很多人会下意识划走:又一个讲MLOps流程的泛泛而谈?但关键…

2026/7/4 23:37:20 阅读更多 →
【Java课程设计/毕业设计】花园设计案例展示与预约咨询管理系统的设计与实现 景观设计师工作调度管理系统【附源码、数据库、万字文档】

【Java课程设计/毕业设计】花园设计案例展示与预约咨询管理系统的设计与实现 景观设计师工作调度管理系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/4 23:35:18 阅读更多 →
CentOS 8.5手动修复CVE-2021-4034 PwnKit漏洞实战指南

CentOS 8.5手动修复CVE-2021-4034 PwnKit漏洞实战指南

1. 项目概述最近在巡检一批老旧的CentOS 8.5服务器时,一个熟悉又刺眼的名字再次跳了出来:CVE-2021-4034,也就是那个大名鼎鼎的“PwnKit”漏洞。这个漏洞虽然已经过去几年,但因其影响深远、利用简单,至今仍是安全渗透测…

2026/7/4 23:33:16 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻