SQLAlchemy 的使用

前边所讲述的使用PyMySQL进行数据库连接的时候,对数据库进行操作是直接使用SQL语言,而SQLAlchemy 将数据库对象化,实现用 Python 对象和代码来操作数据库,而不是直接编写复杂的 SQL 语句。

一、SQLAlchemy的基础信息

1、介绍及主要组件

SQLAlchemy 本质是 Python 中一个功能强大的SQL 工具包和对象关系映射器。它使用 pymysql 这类驱动作为底层通信工具,自身是更高级、更完整的抽象层。按照功能清晰分为两部分组件:SQLAlchemy Core (SQL 核心层)和SQLAlchemy ORM (对象关系映射器)

  • SQLAlchemy Core:这是数据库抽象的基础层,独立于ORM存在,核心是SQL表达式语言。允许使用Python对象构造SQL语句,之后执行并获取结果。
  • SQLAlchemy ORM:这是最常被使用的部分,构建在Core之上,将数据库中的表映射为Python的类,将表中的行映射为类的实例。其主要优点为:可以用面向对象的方式操作数据(自动处理很多底层的SQL操作),极大提升了代码的可读性和可维护性。

在使用的过程中,如何选择:Core 还是 ORM?

  • 选择 SQLAlchemy Core:如果你的应用需要高度定制化、复杂的 SQL 查询,或者你更习惯使用类似 SQL 的声明式风格,并希望完全掌控 SQL 生成。
  • 选择 SQLAlchemy ORM:对于大多数应用,尤其是业务逻辑复杂、数据模型以对象为中心的 Web 应用,使用 ORM 可以显著提升开发效率、减少重复代码,并使代码更易于理解和维护。

2、主要特性与优势

  1. 统一的数据库接口:支持包括 SQLite、PostgreSQL、MySQL、Oracle、MS-SQL Server 在内的多种主流数据库,更换数据库时通常只需修改连接字符串及其配置信息。

  2. 强大的关系处理:能优雅地定义和操作表之间的一对多、多对一等复杂关系。

  3. 连接池管理:内置高效的数据库连接池,提升应用性能。

  4. 事务安全:明确的事务机制确保数据一致性,所有操作在提交 (commit()) 前不会真正持久化。

  5. 防范SQL注入:强制使用参数绑定,避免 SQL 注入攻击。

  6. 异步支持:通过asyncio扩展支持异步数据库操作,适用于现代高性能 Web 应用。

二、SQLAlchemy的使用

1、创建配置文件config.py和数据库引擎

config文件中有配置数据库连接池的配置信息

# config文件 import os class Config: # 从环境变量获取,避免硬编码 DB_HOST = os.getenv('DB_HOST', 'localhost') DB_PORT = os.getenv('DB_PORT', '5432') DB_NAME = os.getenv('DB_NAME', 'mydb') DB_USER = os.getenv('DB_USER') DB_PASSWORD = os.getenv('DB_PASSWORD') # 生产环境推荐使用连接池 DATABASE_URL = f'postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}' # 连接池配置 POOL_SIZE = 20 MAX_OVERFLOW = 30 POOL_RECYCLE = 3600 # 1小时回收连接 POOL_PRE_PING = True # 连接前ping测试 # 创建数据库引擎,可以另写一个文件 from sqlalchemy import create_engine def create_db_engine(): return create_engine( Config.DATABASE_URL, pool_size=Config.POOL_SIZE, max_overflow=Config.MAX_OVERFLOW, pool_recycle=Config.POOL_RECYCLE, pool_pre_ping=Config.POOL_PRE_PING, echo=False # 生产环境设为False,开发时可设为True查看SQL )

2、模型定义与关系映射

(1)创建模型基类base.py,该文件中包含有所数据库表的共同信息。

from sqlalchemy.orm import DeclarativeBase, declared_attr from sqlalchemy import Column, Integer, DateTime from datetime import datetime class Base(DeclarativeBase): """所有模型的基类""" @declared_attr.directive def __tablename__(cls): # 自动将类名转换为小写复数作为表名 return cls.__name__.lower() + 's' # 每个表都有的通用字段 id = Column(Integer, primary_key=True, autoincrement=True) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

(2)定义业务模型user.py,继承Base类,并添加自身独特的列名

from sqlalchemy import String, Text, Boolean, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from .base import Base class User(Base): __tablename__ = 'users' # 显式指定表名 # 列定义 username: Mapped[str] = mapped_column(String(50), unique=True, nullable=False) email: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) hashed_password: Mapped[str] = mapped_column(String(200), nullable=False) is_active: Mapped[bool] = mapped_column(Boolean, default=True) # 关系定义(一对多) posts: Mapped[list['Post']] = relationship( 'Post', back_populates='author', cascade='all, delete-orphan' ) class Post(Base): __tablename__ = 'posts' title: Mapped[str] = mapped_column(String(200), nullable=False) content: Mapped[str] = mapped_column(Text, nullable=False) author_id: Mapped[int] = mapped_column(ForeignKey('users.id')) # 反向关系 author: Mapped['User'] = relationship('User', back_populates='posts')

3、创建会话工厂session.py

创建会话工厂(Session Factory)是SQLAlchemy生产环境中的核心模式,主要为了高效、安全地管理数据库会话的生命周期。

作用维度具体机制与优势
资源复用工厂模式避免每次操作都重新配置会话,复用配置(如绑定引擎、事务设置),减少开销
统一控制集中设置事务隔离级别、自动刷新、过期策略等,确保所有会话行为一致
生命周期管理工厂产生的每个会话独立,避免线程间状态污染,便于连接池管理
依赖注入友好可轻松集成到FastAPI、Flask等框架的依赖注入系统
from sqlalchemy.orm import sessionmaker from config import create_db_engine # 创建引擎 engine = create_db_engine() # 创建会话工厂 SessionLocal = sessionmaker( bind=engine, autocommit=False, autoflush=False, expire_on_commit=True # 生产环境推荐True ) # 依赖注入使用的会话获取器 def get_db(): """FastAPI等框架中使用的依赖项""" db = SessionLocal() try: yield db db.commit() except Exception: db.rollback() raise finally: db.close()

4、业务操作示例

from sqlalchemy.orm import Session, selectinload from sqlalchemy import select from models.user import User, Post class UserService: @staticmethod def create_user(db: Session, username: str, email: str, password: str): """创建用户""" user = User( username=username, email=email, hashed_password=hash_password(password) ) db.add(user) db.commit() db.refresh(user) # 获取数据库生成的ID return user @staticmethod def get_user_with_posts(db: Session, user_id: int): """获取用户及其所有文章(避免N+1查询)""" stmt = select(User).where(User.id == user_id).options( selectinload(User.posts) # 使用selectinload预加载 ) result = db.execute(stmt) return result.scalar_one_or_none() @staticmethod def bulk_create_posts(db: Session, user_id: int, posts_data: list): """批量创建文章(高性能)""" posts = [ Post(title=data['title'], content=data['content'], author_id=user_id) for data in posts_data ] db.add_all(posts) db.commit()

5、其他操作

(1)数据库迁移管理

初始化Alembic——> 配置Alembic环境——>生成并应用迁移

# 初始化Alembic alembic init alembic

配置环境env.py

# alembic/env.py 中修改 import sys import os sys.path.append(os.path.dirname(os.path.dirname(__file__))) from models.base import Base from config import create_db_engine # 使用生产环境的引擎 engine = create_db_engine() # 设置目标元数据 target_metadata = Base.metadata

生成并迁移

# 生成迁移脚本 alembic revision --autogenerate -m "create user and post tables" # 应用迁移到数据库 alembic upgrade head # 查看当前版本 alembic current # 回滚到上一个版本 alembic downgrade -1
(2)docker容器化
# Dockerfile FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 启动时运行数据库迁移 CMD ["sh", "-c", "alembic upgrade head && python app/main.py"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1200687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊雪花算法的5大坑!

前言 今天想和大家聊聊分布式系统中常用的雪花算法(Snowflake)——这个看似完美的ID生成方案,实际上暗藏玄机。 有些小伙伴在工作中一提到分布式ID,第一个想到的就是雪花算法。 确实,它简单、高效、趋势递增&#x…

java_ssm119运列车物资定额及领用管理系统_idea项目源码

目录具体实现截图项目概述技术架构核心功能创新点应用价值系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 项目概述 Java SSM119运列车物资定额及领用管理系统是基于SSM(SpringSprin…

Vlm-Clip的python部署流程及逻辑代码

第一步构建样本集 需要 无缺陷图像,缺陷图像(大缺陷,小缺陷), 对应缺陷图像的Mask 缺陷图像Mask(大图像Mask,小图像Mask) 要求:对应Mask完整,且路径匹配&am…

java_ssm112考研交流平台_idea项目源码

目录具体实现截图项目概述技术栈核心功能创新点应用价值系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 项目概述 Java_SSM112考研交流平台是一个基于SSM(SpringSpringMVCMyBatis&am…

java_ssm120选课成绩教案管理系统_idea项目源码

目录 具体实现截图项目概述技术架构核心功能数据库设计项目亮点部署说明 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 项目概述 Java SSM120选课成绩教案管理系统是基于SSM(Spri…

Spring + asyncTool:实现复杂任务的编排

一、集成到 Spring Boot 1. 添加依赖 在项目的 pom.xml 文件中添加 asyncTool 的依赖&#xff1a; <dependency><groupId>com.jd.platform</groupId><artifactId>asyncTool</artifactId><version>版本号</version> </dependency…

Maven 4 要来了:15 年后,Java 构建工具迎来“彻底重构”

自 2010 年 Maven 3 发布 以来&#xff0c;Maven 对 Java 构建生态的整体支持方式&#xff0c;几乎没有发生过颠覆性的变化。 然而在这 15 年里&#xff0c;Java 世界早已天翻地覆&#xff1a; •模块化成为标配•并行构建成为刚需•云原生与容器化成为主流•JDK 以一年两个大…

收藏!Java程序员转型大模型指南:从入门到落地,抢占AI红利实现薪资跃升

在人工智能&#xff08;AI&#xff09;技术爆发式迭代的当下&#xff0c;传统编程领域正经历前所未有的职业重构。对于深耕Java开发的程序员而言&#xff0c;从熟悉的企业级应用开发、分布式系统搭建&#xff0c;转向如今炙手可热的大模型领域&#xff0c;绝非简单的技术跨界—…

Vlm-ClipJsonl代码

import os import json# 你的实际路径配置&#xff08;无需修改&#xff09; # 脚本所在目录&#xff08;train目录&#xff09; SCRIPT_ROOT os.path.dirname(os.path.abspath(__file__)) # 数据集根路径&#xff08;train/data&#xff09; BASE_PATH os.path.join(SCRIP…

java_ssm114自行车在线租赁系统设计与实现_idea项目源码

目录 具体实现截图自行车在线租赁系统设计与实现摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 自行车在线租赁系统设计与实现摘要 自行车在线租赁系统基于SSM&#xff08;SpringSpringM…

瞧瞧别人家的日志打印,那叫一个优雅!

前言这篇文章跟大家一起聊聊打印优雅日志的10条军规&#xff0c;希望对你会有所帮助。第1条&#xff1a;格式统一反例&#xff08;管理看到会扣钱&#xff09;&#xff1a;log.info("start process"); log.error("error happen"); 无时间戳&#xff0c;无上…

java_ssm6专门体检预约管理系统_idea项目源码

目录具体实现截图系统概述技术架构核心功能模块数据库设计项目亮点系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 系统概述 Java_SSM6专门体检预约管理系统基于SpringSpringMVCMyBatis&#xf…

[特殊字符] 栈与队列基础知识全面解析

一、栈(Stack)理论基础 1.1 栈的基本特性 栈是一种后进先出(LIFO, Last In First Out) 的数据结构,操作只在栈顶进行。 // 栈的基本操作 stack<int> st; st.push(1); // 入栈 st.push(2); int top = st.top(); // 查看栈顶元素:2 st.pop(); // 出栈,…

医疗器械包装运输验证标准:GB/T4857系列标准

一、GB/T 4857系列核心测试标准解析 GB/T 4857《包装 运输包装件基本试验》系列标准涵盖23个部分&#xff0c;针对医疗器械运输场景&#xff0c;以下核心标准构成了全方位的测试体系&#xff1a; &#xff08;一&#xff09;冲击类试验&#xff1a;模拟碰撞风险 跌落试验&am…

java_ssm7特产农产品网上商城的设计与实现_idea项目源码

目录 具体实现截图项目背景与意义技术架构核心功能模块创新点与优势应用价值 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 项目背景与意义 随着互联网技术的发展和农村电商的兴起&#xff0…

java_ssm115计算机系统在线考试平台_idea项目源码

目录 具体实现截图计算机系统在线考试平台摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 计算机系统在线考试平台摘要 该在线考试平台基于Java SSM框架&#xff08;SpringSpring MVCMyBa…

java_ssm8中药中草药商城 供求信息管理系统_idea项目源码

目录 具体实现截图项目背景与目标技术架构核心功能模块创新与优势适用场景总结 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 项目背景与目标 中药中草药商城供求信息管理系统基于Java SSM框…

小迪安全2023-2024|第102天:漏洞发现-漏扫项目篇Poc开发Yaml语法插件一键生成匹配结_笔记|web安全|渗透测试|

第102天&#xff1a;漏洞发现-漏扫项目篇&Poc开发&Yaml语法&插件一键生成&匹配结_笔记 一、漏洞发现—漏扫项目篇&#xfeff;00:15 1. 漏洞扫描工具分类&#xfeff;01:50 综合类工具&#xff1a; BurpSuite&#xff1a;集成化Web应用测试平台&#xff0c;…

C++中string与char的全面解析

一、char(字符) 1.1 基本概念 char 是C++中的基本数据类型,用于表示单个字符。 char c = A; // 单个字符用单引号 char zero = 0; // 字符0,ASCII值为48 char space = ; // 空格字符 char newline = \n; // 转义字符1.2 重要特性 大小:通常1字节(8位)…

如何搭建自动化测试框架?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近好多小伙伴都在说接口自动化测试&#xff0c;那么究竟什么是接口自动化测试呢&#xff1f;让我们一起往下看就知道了&#xff0c;首先我们得先弄清楚下面这…