iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何修复使用Python ORM工具SQLAlchemy时的陷阱
  • 334
分享到

如何修复使用Python ORM工具SQLAlchemy时的陷阱

2023-06-16 17:06:52 334人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这期内容当中小编将会给大家带来有关如何修复使用python ORM工具sqlAlchemy时的陷阱,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在使用 SQLAlchemy 时,那些看似很小的选择可能对这

这期内容当中小编将会给大家带来有关如何修复使用python ORM工具sqlAlchemy时的陷阱,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

在使用 SQLAlchemy 时,那些看似很小的选择可能对这种对象关系映射工具包的性能产生重要影响。

对象关系映射Object-relational mapping(ORM)使应用程序开发人员的工作更轻松,在很大程度是因为它允许你使用你可能知道的语言(例如 Python)与数据库交互,而不是使用原始 SQL 语句查询。SQLAlchemy  是一个 Python ORM 工具包,它提供使用 Python 访问 SQL 数据库的功能。它是一个成熟的 ORM  工具,增加了模型关系、强大的查询构造范式、简单的序列化等优点。然而,它的易用性使得人们很容易忘记其背后发生了什么。使用 SQLAlchemy  时做出的看似很小的选择可能产生非常大的性能影响。

解释开发人员在使用 SQLAlchemy 时遇到的一些最重要的性能问题,以及如何解决这些问题。

只需要计数但检索整个结果集

有时开发人员只需要一个结果计数,但是没有使用数据库计数功能,而是获取了所有结果,然后使用 Python 中的 len 完成计数。

count = len(User.query.filter_by(acct_active=True).all())

相反,使用 SQLAlchemy 的 count 方法将在服务器端执行计数,从而减少发送到客户端的数据。在前面的例子中调用 all() 也会导致模型对象的实例化,如果有很多数据,那么时间代价可能会非常昂贵。

除非还需要做其他的事情,否则只需使用 count 方法:

count = User.query.filter_by(acct_active=True).count()

只需要几列时检索整个模型

在许多情况下,发出查询时只需要几列数据。SQLAlchemy 可以只获取你想要的列,而不是返回整个模型实例。这不仅减少了发送的数据量,还避免了实例化整个对象。使用列数据的元组而不是模型可以快得多。

result = User.query.all()for user in result:    print(user.name, user.email)

反之,使用 with_entities 方法只选择所需要的内容:

result = User.query.with_entities(User.name, User.email).all()for (username, email) in result:    print(username, email)

每次循环都更新一个对象

避免使用循环来单独更新集合。虽然数据库可以非常快地执行单个更新,但应用程序和数据库服务器之间的往返时间将快速累加。通常,在合理的情况下争取更少的查询。

for user in users_to_update:  user.acct_active = True  db.session.add(user)

改用批量更新方法:

query = User.query.filter(user.id.in_([user.id for user in users_to_update]))query.update({"acct_active": True}, synchronize_session=False)

触发级联删除

ORM 允许在模型关系上进行简单的配置,但是有一些微妙的行为可能会令人吃惊。大多数数据库通过外键和各种级联选项维护关系完整性。SQLAlchemy 允许你使用外键和级联选项定义模型,但是 ORM 具有自己的级联逻辑,可以取代数据库。

考虑以下模型:

class Artist(Base):    __tablename__ = "artist"     id = Column(Integer, primary_key=True)    songs = relationship("Song", cascade="all, delete")  class Song(Base):    __tablename__ = "song"     id = Column(Integer, primary_key=True)    artist_id = Column(Integer, ForeignKey("artist.id", ondelete="CASCADE"))

删除歌手将导致 ORM 在 song 表上发出 delete 查询,从而防止由于外键导致的删除操作。这种行为可能会成为复杂关系和大量记录的瓶颈。

请包含 passive_deletes 选项,以确保让数据库来管理关系。但是,请确保你的数据库具有此功能。例如,SQLite 默认情况下不管理外键。

songs = relationship("Song", cascade  all, delete", passive_deletes=True)

当要使用贪婪加载时,应使用延迟加载

延迟加载是 SQLAlchemy 处理关系的默认方法。从上一个例子构建来看,加载一个歌手时不会同时加载他或她的歌曲。这通常是一个好主意,但是如果总是需要加载某些关系,单独的查询可能会造成浪费。

如果允许以延迟方式加载关系,像 Marshmallow 这样流行的序列化框架可以触发级联查询。

有几种方法可以控制此行为。最简单的方法是通过 relationship 函数本身。

songs = relationship("Song", lazy="joined", cascade="all, delete")

这将导致一个左连接被添加到任何歌手的查询中,因此,songs 集合将立即可用。尽管有更多数据返回给客户端,但往返次数可能会少得多。

SQLAlchemy 为无法采用这种综合方法的情况提供了更细粒度的控制,可以使用 joinedload() 函数在每个查询的基础上切换连接的加载。

from sqlalchemy.orm import joinedload artists = Artist.query.options(joinedload(Artist.songs))print(artists.songs) # Does not incur a roundtrip to load

使用 ORM 进行批量记录导入

导入成千上万条记录时,构建完整模型实例的开销会成为主要瓶颈。想象一下,从一个文件中加载数千首歌曲记录,其中每首歌曲都先被转换为字典。

for song in songs:    db.session.add(Song(`song))

相反,绕过 ORM,只使用核心的 SQLAlchemy 参数绑定功能。

batch = []insert_stmt = Song.__table__.insert()for song in songs:    if len(batch) > 1000:       db.session.execute(insert_stmt, batch)       batch.clear()    batch.append(song)if batch:    db.session.execute(insert_stmt, batch)

请记住,此方法会自然而然地跳过你可能依赖的任何客户端 ORM 逻辑,例如基于 Python 的列默认值。尽管此方法比将对象加载为完整的模型实例要快,但是你的数据库可能具有更快的批量加载方法。例如,postgresqlCOPY 命令为加载大量记录提供了最佳性能。

过早调用提交或刷新

在很多情况下,你需要将子记录与其父记录相关联,反之亦然。一种显然的方法是刷新会话,以便为有问题的记录分配一个 ID。

artist = Artist(name="Bob Dylan")song = Song(title="Mr. Tambourine Man") db.session.add(artist)db.session.flush() song.artist_id = artist.id

对于每个请求,多次提交或刷新通常是不必要的,也是不可取的。数据库刷新涉及强制在数据库服务器上进行磁盘写入,在大多数情况下,客户端将阻塞,直到服务器确认已写入数据为止。

SQLAlchemy 可以在幕后跟踪关系和管理相关键。

artist = Artist(name="Bob Dylan")song = Song(title="Mr. Tambourine Man") artist.songs.append(song)

总结

我希望这一系列常见的陷阱可以帮助你避免这些问题,并使你的应用平稳运行。通常,在诊断性能问题时,测量是关键。大多数数据库都提供性能诊断功能,可以帮助你定位问题,例如 PostgreSQL 的 pg_stat_statements 模块。

上述就是小编为大家分享的如何修复使用Python ORM工具SQLAlchemy时的陷阱了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网Python频道。

--结束END--

本文标题: 如何修复使用Python ORM工具SQLAlchemy时的陷阱

本文链接: https://www.lsjlt.com/news/284540.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何修复使用Python ORM工具SQLAlchemy时的陷阱
    这期内容当中小编将会给大家带来有关如何修复使用Python ORM工具SQLAlchemy时的陷阱,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在使用 SQLAlchemy 时,那些看似很小的选择可能对这...
    99+
    2023-06-16
  • Python数据库ORM工具sqlalchemy怎么安装使用
    今天就跟大家聊聊有关Python数据库ORM工具sqlalchemy怎么安装使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。SQLAlchemy是...
    99+
    2024-04-02
  • ps如何使用修复画笔工具
    这篇文章将为大家详细讲解有关ps如何使用修复画笔工具,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 修复画笔工具可以从图像中取样或用图案填充图像,修补图像的瑕疵,修复画...
    99+
    2024-04-02
  • 如何在使用NPM时避免常见的错误和陷阱?
    NPM(Node Package Manager)是一个包管理器,用于在Node.js中管理软件包。它是Node.js社区最流行的包管理器之一。NPM可以帮助开发者轻松地安装、更新和卸载软件包,以及管理软件包之间的依赖关系。但是,即使对于...
    99+
    2023-06-21
    并发 ide npm
  • 如何使用 Golang ORM 工具与数据库交互?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • 教你win7蓝屏修复工具如何使用
    一名网友报告称在使用Windows 7电脑时遇到了蓝屏问题,并且不清楚造成这种情况的原因是什么。我们可以使用win7蓝屏修复工具来分析和解决win7蓝屏问题。下面小编将教大家如何使用win7蓝屏修复工具。请告诉我你需要的帮助。具体步骤如下:...
    99+
    2023-07-14
  • 如何使用pt工具校验修复主从
    这篇文章主要为大家展示了“如何使用pt工具校验修复主从”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用pt工具校验修复主从”这篇文章吧。使用pt工具校验主...
    99+
    2024-04-02
  • ps如何使用污点修复画笔工具
    这篇文章主要为大家展示了“ps如何使用污点修复画笔工具”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ps如何使用污点修复画笔工具”这篇文章吧。 污点修复画笔工...
    99+
    2024-04-02
  • win10修复引导工具如何用
    本篇内容介绍了“win10修复引导工具如何用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!win10修复引导工具怎么用步骤引导修复的命令是:...
    99+
    2023-07-01
  • ps修补工具如何使用
    这篇文章主要介绍“ps修补工具如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ps修补工具如何使用”文章能帮助大家解决问题。首先打开ps,打开想要修补的图片。 在电脑里找到它,点击“打开” 打...
    99+
    2023-07-02
  • ps如何使用修补工具
    这篇文章给大家分享的是有关ps如何使用修补工具的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 修补工具可以用其他区域或图案中的像素,来修复选中的区域,修补工具是较为精确的修复工...
    99+
    2024-04-02
  • python如何使用cProfile工具
    这篇文章给大家分享的是有关python如何使用cProfile工具的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Profile性能分析工具cProfile(语言编写的测试模块)是一个标准库内建的性能分析工具,可以...
    99+
    2023-06-17
  • directx修复工具win10的使用教程
    我们在使用win10系统运行程序时,难免会遇到一些无法正常启动的提示,这个时候我们就可以选择使用directx修复工具来解决,可是对于不熟悉directx修复工具的用户来说,完全不知道该如何使用,今天小编来跟大家说说directx修复工具w...
    99+
    2023-07-19
  • 如何使用Python的SAML工具包 python-saml
    本篇文章为大家展示了如何使用Python的SAML工具包 python-saml,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python-saml 是 Python 的 SAML 工具包。示例代码...
    99+
    2023-06-02
  • 如何使用 Linux 文件恢复工具
    如何使用 Linux 文件恢复工具,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Linux 系统管理员守则中有这么一条:“慎用 rm -rf 命令,除非你知道此命令所带来的后果...
    99+
    2023-06-16
  • Win7系统中的桌面小工具无法使用或显示不正常时如何修复
     Win 7系统相比较win XP增加了许多常用小程序的集合,有“日历”、“时钟”、“便签”等等。但是当Win 7系统中的桌面小工具无法使...
    99+
    2023-06-04
    Win7 桌面小工具 工具 桌面 系统
  • mysql中如何使用mytop实时监控工具
    这篇文章给大家介绍mysql中如何使用mytop实时监控工具,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mytop类似于linux top工具,可以实时监控mysql服务器的性能信息...
    99+
    2024-04-02
  • 如何使用Python中的可视化工具Matplotlib
    如何使用Python中的可视化工具Matplotlib,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Matplotlib是一个Python 2D绘图库和一些基本的3D图表,...
    99+
    2023-06-16
  • win10自带的系统修复工具怎么使用
    在Windows 10中,有几种不同的系统修复工具可供使用。下面是使用一些常见的系统修复工具的方法:1. 系统文件检查工具(SFC)...
    99+
    2023-10-09
    win10
  • 使用myisamchk和mysqlcheck工具如何修复损坏的MySQL数据库文件
    这篇文章将为大家详细讲解有关使用myisamchk和mysqlcheck工具如何修复损坏的MySQL数据库文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。由于服务器的数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作