[Python] ORM数据库SQLAlchemy的使用示例

news/2025/2/24 14:08:30/文章来源:https://www.cnblogs.com/pumbaa/p/18733930

SQLAlchemy 是 Python 中一个非常流行的对象关系映射(ORM)库,用于简化数据库操作。它提供了一种灵活的方式,让开发者可以用 Python 代码与数据库交互,而无需直接编写大量的 SQL 语句。

简单来说,SQLAlchemy 的主要特点包括:

  1. ORM 功能:可以将数据库表映射为 Python 类,把表中的行当作对象来操作。这样,你可以用面向对象的方式处理数据,比如创建、查询、更新和删除记录。
  2. 数据库抽象:支持多种数据库(如 SQLite、MySQL、PostgreSQL 等),只需稍作调整就能切换数据库类型,而不用重写大部分代码。
  3. 灵活性:除了 ORM,它还提供了底层的 SQL 表达式语言,允许你直接编写复杂的 SQL 查询,适合需要精细控制的场景。
  4. 会话管理:通过 Session 对象管理数据库连接和事务,确保操作高效且安全。
举个简单的例子:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 创建数据库连接
engine = create_engine('sqlite:///example.db')
Base = declarative_base()# 定义一个模型
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)# 创建表
Base.metadata.create_all(engine)# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 添加数据
new_user = User(name='Alice')
session.add(new_user)
session.commit()# 查询数据
user = session.query(User).filter_by(name='Alice').first()
print(user.name)  # 输出: Alice

在 SQLAlchemy 中,创建表通常是通过定义模型类并结合 Base.metadata.create_all() 方法完成,定义的模型类继承Base,在执行创建表语句Base.metadata.create_all(engine)之前,只要模型类被引入(import)就会被创建。

 

问题一:解决查询的数据在脱离会话(Session)后不能正常使用问题。

当你从会话中查询数据(比如 session.query(User).first()),返回的对象通常绑定到该会话。如果会话关闭(session.close())或提交(session.commit())后,对象可能进入“过期”状态。访问它的属性时,可能会触发“DetachedInstanceError”,因为 SQLAlchemy 试图通过已关闭的会话加载数据。

解决方法

  • 使用 expunge:在会话关闭前,可以用 session.expunge(obj) 将对象从会话中分离,这样它就不再依赖会话,可以独立使用。
  • 关闭自动过期:设置 expire_on_commit=False(在 sessionmaker 中),这样提交后对象不会过期,可以继续使用。

我的项目中使用了上面两个方法。

 

问题二:解决多线程共用一个会话,保存数据时混乱问题。

在 SQLAlchemy 中,多线程共用一个会话(Session)可能会导致数据混乱,因为会话默认不是线程安全的。每个线程可能同时操作同一个会话对象,引发竞争条件、数据覆盖或事务冲突等问题。为了解决这个问题,可以采取以下方法:

  • 为每个线程创建独立的 Session 对象,避免共享同一个会话。
  • 使用线程局部会话(Scoped Session)(推荐):SQLAlchemy 提供了 scoped_session,它利用 Python 的 threading.local() 确保每个线程有独立的会话实例,但全局共用一个会话工厂。
  • 数据库连接池管理SQLAlchemy 的引擎自带连接池(默认使用 QueuePool),可以支持多线程访问数据库。但会话本身仍需独立管理,连接池只负责底层的数据库连接复用。

我的项目中,使用第三种方案, QueuePool线程池+会话管理。

 

问题三:修改模型类同步更新数据库表结构问题。

在 SQLAlchemy 中,当你修改了模型类(比如添加、删除字段或更改约束)后,数据库表结构并不会自动同步更新,因为 SQLAlchemy 本身不提供内置的表结构迁移功能。不过,可以通过以下方法解决这个问题:

  • 手动更新表结构修改模型类后,手动编写并执行 SQL 语句(如 ALTER TABLE)来调整数据库表结构。
  • 使用 Alembic 进行数据库迁移。
  • 重建表(不推荐)。

我的项目中,使用创建临时表,再重建表逐条恢复数据,仅支持SQLite数据库。

项目git路径:https://gitee.com/Pumbaa_Peng/pp-spyder.git

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

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

相关文章

uipath更新到最新版本2025.0.161出现严重问题

uipath更新到最新版本2025.0.161出现严重问题:1. 打开既有项目,会报CS0246错误2. 无法创建新项目,一直报无权限访问尝试办法:1. 重新安装uipath,未解决2. 删除项目重新添加,未解决3. 给账户添加最高权限,未解决 workaround:把项目从默认文件夹复制到其他盘(除了C盘外…

Python正则表达式之re.compile函数

​在Python编程语言中,re.compile函数是正则表达式模块(re)中的一个核心组件,它负责将文本形式的正则表达式编译成一个正则表达式对象。这个对象随后可以被用来执行高效的模式匹配操作,如查找、替换或者分割字符串等。理解并有效利用 re.compile对于编写高效且可维护的正则表…

Unity Addresable打包总结第二弹

前言 前文介绍了Addressables在本地打包是怎么使用,这里介绍下怎么打远程包,并且怎么做到打增量包,Lets Go! 远程包新建一个Group,将它的 BUild & Load Paths 改为Remote,并将RemoteRes资源文件夹塞入Remote Group,其中包含一个Capsule.prefab资源:在Addressabvles …

BUUCTF-RE-[2019红帽杯]easyRE

这道题很难,但是并不难在他的解题要用到的方法和技巧上,而是难在它的题目设计。做的过程中真的有一种闯关的感觉,非常有趣 首先我们通过对字符的定位我们可以来到sub_4009C6函数 __int64 sub_4009C6() {__int64 result; // raxint i; // [rsp+Ch] [rbp-114h]__int64 v2; // …

2025年免费项目管理软件哪家强?5款零成本工具实测报告

在项目管理领域,众多团队尤其是初创企业和小型项目组,都渴望找到功能实用且零成本的软件来助力项目推进。2025 年,有 5 款免费项目管理软件表现突出,它们分别是禅道、Trello、Asana、Redmine 以及国内新兴的钉钉项目管理相关功能,下面将为大家带来详细的实测报告。一、禅道…

BT151-ASEMI电机控制专用BT151

BT151-ASEMI电机控制专用BT151编辑:ll 在当今科技飞速发展的时代,电子元件宛如繁星般点缀着各个领域,而 BT151 单向可控硅无疑是其中一颗极为耀眼的明星。 BT151-ASEMI电机控制专用BT151 型号:BT151 品牌:ASEMI 封装:TO-220F 正向电流:12A 反向电压:600V~800V 引脚数量…

销售必备60招

脸皮厚、嘴巴甜、手脚勤。先放下面子努力拿下客户,提高收入,往后在亲友面前抢着买单时,面子自然就有了。干销售得有狼性、野性和匪性,还要有胆量。推销是常识的运用,但只有将经实践验证的理念用于积极的客户身上,才会产生效果。想要取得惊人成绩,必须先做好枯燥乏味的准…

【H2O系列】关于H2O和OmniH2O代码安装及代码解读摘要`

0. 前言 这篇博客主要用于过程记录H2O代码部分的参数解读部分。 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 1. 论文&项目 项目地址:https://omni.human2humanoid.com/ 我自己总结的论文摘要…

1小时搭建好的智能车间生产看板长什么样?

大家一提到生产看板搭建,可能脑袋里第一反应就是“哎,这个得花大钱买专业软件吧”或者“搭建起来肯定超级复杂”。 其实,真没那么难! 只要找对方法,学会用对工具,搭建一套生产看板其实很简单。 那天,我就亲自试了一下,结果不到两三小时,就做出了一套智能生产看板。 但…

MCN公司如何打造爆款内容?内容创新与品质提升的秘诀

MCN(多频道网络)管理优化是一个涉及多个方面的复杂过程,旨在提升MCN公司的运营效率、增强市场竞争力并实现可持续发展。以下是一些关键的MCN管理优化策略: 一、市场定位与品牌建设 精准市场定位 ○ 深入了解目标受众,包括他们的兴趣、需求和行为模式。 ○ 对自身资源和优势…

JavaScript代码混淆入门

JavaScript代码混淆是一种提升Web应用安全性的策略,旨在使代码难以阅读和理解,从而增加逆向工程的难度。这对于保护知识产权、防止抄袭及减少恶意攻击尤为重要。本文将深入浅出地介绍JavaScript代码混淆的基础概念、重要性、主要方法以及实际应用技巧。 JavaScript代码混淆的…

【解决Deepseek服务器繁忙问题】Chatbox + 硅基流动API调用deepseek-R1满血版教程,搭建本地AI助手

1. 解决Deepseek服务器繁忙问题,无需等待使用Deepseek:Chatbox本地部署 + 硅基流动API调用,绕过官方限流无限速调用 2. 两个简单步骤:从配置到运行全部有截图​ 一、硅基流动官网注册 + 获取密钥 官网链接:https://cloud.siliconflow.cn/i/kKzwdArg填写手机号,获取验证码…