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

Python ORM实战:SQLAlchemy深度解析

Python ORM实战SQLAlchemy深度解析引言在Python后端开发中ORM对象关系映射是连接应用程序和数据库的重要桥梁。作为一名从Rust转向Python的后端开发者我深刻体会到SQLAlchemy在处理数据库操作方面的强大能力。SQLAlchemy提供了灵活的查询接口和强大的事务管理是Python生态中最流行的ORM框架。ORM核心概念什么是ORMORM是一种将面向对象编程与关系型数据库进行映射的技术具有以下特点对象与表映射将Python类映射到数据库表查询抽象使用面向对象方式编写查询数据库无关支持多种数据库后端事务管理提供完整的事务支持架构设计┌─────────────────────────────────────────────────────────────┐ │ Python 应用层 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 业务逻辑 → ORM模型 → 查询构建 │ │ │ └─────────────────────────┬─────────────────────────┘ │ └─────────────────────────────┼─────────────────────────────┘ │ SQLAlchemy Core ▼ ┌─────────────────────────────────────────────────────────────┐ │ SQLAlchemy 层 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 查询编译 → SQL生成 → 执行引擎 → 结果映射 │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────┬─────────────────────────────┘ │ SQL语句 ▼ ┌─────────────────────────────────────────────────────────────┐ │ 数据库层 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ MySQL / PostgreSQL / SQLite / Oracle │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘环境搭建与基础配置安装依赖pip install sqlalchemy psycopg2-binary基本配置from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker DATABASE_URL postgresql://user:passwordlocalhost/dbname engine create_engine(DATABASE_URL) SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindengine) Base declarative_base()定义模型from sqlalchemy import Column, Integer, String, DateTime from datetime import datetime class User(Base): __tablename__ users id Column(Integer, primary_keyTrue, indexTrue) name Column(String, indexTrue) email Column(String, uniqueTrue, indexTrue) created_at Column(DateTime, defaultdatetime.utcnow)CRUD操作创建记录def create_user(db, name: str, email: str): user User(namename, emailemail) db.add(user) db.commit() db.refresh(user) return user db SessionLocal() user create_user(db, 张三, zhangsanexample.com)查询记录def get_user(db, user_id: int): return db.query(User).filter(User.id user_id).first() def get_users(db, skip: int 0, limit: int 10): return db.query(User).offset(skip).limit(limit).all() def get_user_by_email(db, email: str): return db.query(User).filter(User.email email).first()更新记录def update_user(db, user_id: int, name: str): user db.query(User).filter(User.id user_id).first() if user: user.name name db.commit() db.refresh(user) return user删除记录def delete_user(db, user_id: int): user db.query(User).filter(User.id user_id).first() if user: db.delete(user) db.commit() return user高级特性实战关系映射from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship class Post(Base): __tablename__ posts id Column(Integer, primary_keyTrue, indexTrue) title Column(String, indexTrue) content Column(String) author_id Column(Integer, ForeignKey(users.id)) author relationship(User, back_populatesposts) User.posts relationship(Post, back_populatesauthor)复杂查询from sqlalchemy import func, and_, or_ def get_active_users_with_posts(db): return db.query(User).join(Post).filter( and_( User.name.like(%张%), Post.title.like(%Python%) ) ).all() def get_user_statistics(db): return db.query( User.name, func.count(Post.id).label(post_count) ).join(Post).group_by(User.id).order_by(func.count(Post.id).desc()).all()事务管理def transfer_funds(db, from_user_id, to_user_id, amount): try: from_user db.query(User).filter(User.id from_user_id).first() to_user db.query(User).filter(User.id to_user_id).first() if from_user.balance amount: raise ValueError(余额不足) from_user.balance - amount to_user.balance amount db.commit() return True except Exception as e: db.rollback() raise e实际业务场景场景一用户管理系统class UserService: def __init__(self, db): self.db db def create_user(self, user_data): user User(**user_data) self.db.add(user) self.db.commit() self.db.refresh(user) return user def get_user_by_id(self, user_id): return self.db.query(User).filter(User.id user_id).first() def get_users_with_filters(self, filters): query self.db.query(User) if name in filters: query query.filter(User.name.like(f%{filters[name]}%)) if email in filters: query query.filter(User.email.like(f%{filters[email]}%)) if min_date in filters: query query.filter(User.created_at filters[min_date]) return query.all()场景二博客系统class PostService: def __init__(self, db): self.db db def create_post(self, title, content, author_id): post Post(titletitle, contentcontent, author_idauthor_id) self.db.add(post) self.db.commit() self.db.refresh(post) return post def get_posts_by_author(self, author_id): return self.db.query(Post).filter(Post.author_id author_id).all() def search_posts(self, keyword): return self.db.query(Post).filter( or_( Post.title.ilike(f%{keyword}%), Post.content.ilike(f%{keyword}%) ) ).all()性能优化查询优化def get_users_eager_loading(db): return db.query(User).options( joinedload(User.posts) ).all() def get_users_only_needed_columns(db): return db.query(User.id, User.name).all()批量操作def bulk_insert_users(db, users_data): users [User(**data) for data in users_data] db.add_all(users) db.commit() def bulk_update_users(db, user_ids, new_name): db.query(User).filter(User.id.in_(user_ids)).update( {name: new_name}, synchronize_sessionFalse ) db.commit()索引优化class User(Base): __tablename__ users id Column(Integer, primary_keyTrue, indexTrue) name Column(String, indexTrue) email Column(String, uniqueTrue, indexTrue) created_at Column(DateTime, indexTrue)总结SQLAlchemy为Python后端开发者提供了强大的ORM能力。通过对象与数据库的映射SQLAlchemy简化了数据库操作提高了开发效率。从Rust开发者的角度来看SQLAlchemy的类型安全和编译时检查与Rust的设计理念有相似之处。在实际项目中建议合理使用索引、批量操作和查询优化来提升性能并注意事务的正确使用。

相关文章:

Python ORM实战:SQLAlchemy深度解析

Python ORM实战:SQLAlchemy深度解析 引言 在Python后端开发中,ORM(对象关系映射)是连接应用程序和数据库的重要桥梁。作为一名从Rust转向Python的后端开发者,我深刻体会到SQLAlchemy在处理数据库操作方面的强大能力。S…...

用电脑自动玩小红书,OpenClaw+ADB让效率翻倍!附详细教程“

本文介绍了如何使用OpenClaw(运行在MacOS上)结合ADB工具实现Android手机的自动化操作。内容涵盖Android手机配置(开启开发者选项和USB调试)、MacOS环境准备(安装ADB工具和配置ADBKeyboard支持中文输入)&…...

AI产品经理 VS 传统产品经理:不是技术升级,而是物种进化!你准备好了吗?

文章指出,AI时代的产品经理并非仅仅是懂点AI技术的传统产品经理升级版,而是完全不同的“物种”。文章从产品经理的职责、核心能力、与AI的协作模式等方面对比了传统产品经理和AI产品经理的区别,强调AI产品经理需要具备处理意图模糊性、设计失…...

新手小白必看!AI大模型自学路线图,从入门到精通_自学AI大模型学习路线推荐

自学AI大模型学习路线推荐 今天,我想和大家分享一条自学AI大模型的学习路线,希望能帮助新手小白们更好地进入这个领域。 1. 打好基础:数学与编程 数学基础 线性代数:理解矩阵、向量、特征值、特征向量等概念。推荐课程&#xff1a…...

基于MCP协议构建监控数据连接器:统一多源数据赋能AI运维

1. 项目概述:一个面向开发者的监控数据连接器如果你是一名开发者,尤其是后端或运维工程师,那么“监控”这个词对你来说一定不陌生。从服务器CPU、内存使用率,到应用接口的响应时间、错误率,再到业务层面的关键指标&…...

微信聊天记录永久备份完整指南:WeChatExporter开源工具终极教程

微信聊天记录永久备份完整指南:WeChatExporter开源工具终极教程 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否担心珍贵的微信聊天记录会因为手机丢失…...

从网易招聘看技术人择校与城市选择:一线城市VS武汉,哪里机会更多?

技术人择校与城市选择指南:数据驱动的职业发展决策 站在高考志愿填报或考研择校的十字路口,每个怀揣技术梦想的年轻人都面临着一个关键抉择:是追逐一线城市的产业聚集效应,还是选择武汉这类高校密集但名企较少的城市?这…...

PostgreSQL COPY命令实战:从CSV导入到导出的完整数据流处理

1. 为什么你需要掌握COPY命令 如果你经常需要把Excel表格或CSV文件的数据导入PostgreSQL数据库,或者反过来把数据库查询结果导出成文件,那么COPY命令就是你的瑞士军刀。我见过太多人还在用Python脚本逐行读写CSV,不仅效率低,代码还…...

AI时代计算机教育变革:从代码生成到系统设计的教学重构

1. 项目概述:当AI走进计算机课堂,我们面临的真实图景作为一名在计算机教育一线摸爬滚打了十几年的从业者,我亲眼见证了从粉笔黑板到多媒体教室,再到如今云端协作的变迁。但最近两年,以ChatGPT、GitHub Copilot为代表的…...

稳压二极管数据手册参数深度解析:从符号到实战选型

1. 稳压二极管核心参数全解析 第一次拿到稳压二极管的数据手册时,我完全被那些密密麻麻的符号搞懵了。VZ、IZK、ZZT这些字母组合到底代表什么?后来在项目中踩过几次坑才明白,这些参数直接关系到电路的稳定性。就拿去年做的一个电源模块来说&a…...

实战解析:Python如何一步步解开JWE加密令牌的秘密

1. 认识JWE:加密令牌的守护者 第一次遇到JWE加密令牌时,我完全懵了。作为一个习惯处理普通JWT的后端开发者,发现常用的jwt.io网站居然无法解析这个令牌,就像拿着钥匙却找不到锁孔。JWE(JSON Web Encryption&#xff09…...

开题报告一次通关密码:告别反复修改,虎贲等考 AI 重新定义高效开题

每一位本硕博学生都懂:开题不顺,论文全乱。开题报告是毕业论文的 “总设计图”,选题、框架、文献、技术路线只要一项不达标,就会被导师反复打回,浪费时间、消耗心态,甚至直接拖慢整个毕业节奏。可自己写开题…...

GPU流水线设计:提升深度学习计算效率的关键技术

1. GPU流水线设计基础概念现代GPU架构为深度学习工作负载提供了强大的并行计算能力,但传统的批量同步并行(BSP)执行模型存在资源利用率低下的问题。GPU流水线技术通过将计算图分解为多个阶段并在其间插入队列节点,实现了计算与通信的重叠执行。1.1 传统B…...

从零搭建ROS Gazebo仿真小车:集成摄像头与YOLO目标检测实现视觉感知

1. 环境准备与ROS安装 在开始构建仿真小车之前,我们需要先搭建好开发环境。ROS(Robot Operating System)是目前机器人开发最流行的框架之一,它提供了硬件抽象、设备驱动、库函数、可视化工具等丰富功能。我推荐使用Ubuntu 20.04 L…...

重构计算机历史叙事:挖掘被遗忘的贡献者与构建包容性科技未来

1. 项目概述:为什么我们需要重写计算机历史如果你问一个对计算机历史稍有了解的人,让他列举几位先驱,大概率会听到冯诺依曼、艾伦图灵、比尔盖茨、史蒂夫乔布斯这些名字。这个名单很长,但有一个共同点:他们几乎都是白人…...

Funannotate数据库安装终极指南:解决HPC环境中的常见问题

Funannotate数据库安装终极指南:解决HPC环境中的常见问题 【免费下载链接】funannotate Eukaryotic Genome Annotation Pipeline 项目地址: https://gitcode.com/gh_mirrors/fu/funannotate Funannotate作为一款专业的真核生物基因组注释流程工具&#xff0c…...

基础设施可观测性:监控和诊断基础设施状态

基础设施可观测性:监控和诊断基础设施状态 一、基础设施可观测性概述 1.1 基础设施可观测性的定义 基础设施可观测性是指通过收集、分析和可视化基础设施的运行数据,来理解和监控基础设施状态的能力。它包括监控服务器、网络、存储等基础设施组件的性能和…...

从零构建高效项目脚手架:自动化项目初始化与最佳实践

1. 项目概述:一个为开发者准备的“瑞士军刀”式工具集最近在GitHub上闲逛,发现了一个挺有意思的项目,叫jpKuji/clawstrate。乍一看这个名字,有点摸不着头脑,既不像常见的框架名,也不像某个具体的应用。点进…...

从零到一:UNet环境搭建与自定义数据集实战指南

1. 环境准备:从Anaconda到PyTorch的完整配置 第一次接触UNet时,我最头疼的就是环境配置。记得当时为了跑通一个细胞分割的demo,整整折腾了两天。现在回头看,其实只要掌握几个关键步骤,整个过程可以非常顺畅。 首先需要…...

Prisma与GraphQL游标分页实战:基于Relay规范的高性能实现

1. 项目概述与核心价值如果你正在用 Prisma 和 GraphQL 构建后端服务,并且需要实现一个高性能、体验流畅的分页功能,那么zoontek/prisma-cursor-pagination这个库很可能就是你一直在找的“瑞士军刀”。分页,尤其是基于游标的分页,…...

边缘部署模式:在边缘位置部署应用

边缘部署模式:在边缘位置部署应用 一、边缘部署概述 1.1 边缘部署的定义 边缘部署是指将应用或服务部署在靠近用户或数据源的边缘位置,以减少延迟、提高性能、降低带宽消耗并增强数据隐私保护。 1.2 边缘部署的价值 低延迟:减少数据传输延迟高…...

Standard计划突然限速?揭秘MJ v6.1后台配额算法变更,3步绕过队列延迟,今日生效

更多请点击: https://intelliparadigm.com 第一章:Standard计划限速事件的全貌还原 2024年Q2,Standard计划在多个云原生生产环境中突发性触发API速率限制(Rate Limiting),导致下游服务批量超时与重试风暴。…...

AI意识与认知操控:技术伦理、风险与治理框架

1. 项目概述:当“意识”成为可编程对象最近几年,我身边不少从事AI研发的朋友,聊天时的话题已经从“模型精度又提升了几个点”逐渐转向了一些更“虚”但更根本的问题。比如,我们训练的大语言模型,在和我们进行几轮深度对…...

金融文档实时检索难?电商SKU模糊匹配慢?DeepSeek垂直搜索3类高价值场景落地,附可复用Prompt工程模板

更多请点击: https://intelliparadigm.com 第一章:金融文档实时检索难?电商SKU模糊匹配慢?DeepSeek垂直搜索3类高价值场景落地,附可复用Prompt工程模板 三大典型业务痛点与DeepSeek-R1适配逻辑 传统向量检索在专业领…...

别再傻傻传文件了!用Java Base64把图片和PDF直接“塞”进HTML页面(附完整代码)

告别文件传输:Java Base64技术实现图片与PDF的HTML直嵌方案 在Web开发中,我们经常遇到需要将图片或PDF文档直接嵌入HTML页面的场景。传统做法通常需要先将文件上传到服务器,然后通过URL引用,这不仅增加了网络请求,还引…...

基于多智能体协作的AI开发流程:三人团队模式解析与实践

1. 项目概述与核心痛点如果你和我一样,在日常开发中深度依赖像Claude这样的AI编码助手,那你一定也经历过那种“又爱又恨”的时刻。爱的是它强大的代码生成和理解能力,恨的是它时不时会“放飞自我”——比如你只想让它修改一个函数&#xff0c…...

不止于水:用MS动力学模拟和RDF分析,探究任意离子/分子在溶液中的溶剂化结构

从水到多元溶液:MS动力学模拟与RDF分析的高级应用指南 当我们需要理解溶液中离子或分子的行为时,径向分布函数(RDF)分析提供了一个强有力的工具。传统的纯水体系研究固然重要,但现实中的溶液系统往往更为复杂——电解液中的锂离子、蛋白质溶液…...

Flexpilot AI:开源可定制的VS Code AI编程助手配置与实战指南

1. 项目概述与核心价值作为一名在开发工具领域摸爬滚打了十多年的老码农,我见证过无数个“下一代编辑器”和“智能助手”的兴衰。当GitHub Copilot横空出世,确实改变了游戏规则,但随之而来的,是开发者们被锁定在单一服务商、高昂的…...

基于LLM的智能体驱动文字冒险游戏引擎设计与实现

1. 项目概述:一个AI驱动的文字冒险游戏引擎最近在GitHub上闲逛,发现了一个挺有意思的项目,叫droxey/agentadventure。光看名字,大概能猜到它和“智能体”(Agent)以及“冒险”(Adventure&#xf…...

定时任务标准化合约:解决Cron Job协作混乱与状态管理难题

1. 项目概述:为定时任务建立“交通规则”在自动化运维和持续集成(CI)领域,定时任务(Cron Job)就像是系统里的“定时闹钟”和“自动工人”。它们负责在后台默默执行数据备份、日志清理、状态检查、报告生成等…...