对我当前项目的同事进行的快速调查显示,在大多数情况下,单词“ ORM和使用数据库”听起来像“炼金术”和“ Django ORM”。 通常,对这两个词的了解足以编写干净,整洁且有效的代码。 但是到目前为止,扩大工程视野还没有损害任何人,因此今天,我们将在一些方面(也许直到今天还不熟悉)为我们处理一下数据库。

悠悠
今天,任何ORM都带有内部数据库迁移系统。 通常,当ORM监视表的结构时,一种简单而酷的方法适合每个人。 但是,此解决方案在使用时很不方便:
在这两种情况下,应用手动迁移都非常方便-我们不依赖ORM模型,但是我们会手工输入必要的SQL指令,并将其输入到简单的迁移器中,该迁移器随后将结构更改应用于数据库。
输出是一个干净,可理解且完全可管理的表结构,经过明智地编译。
对于这种手动方法,有一个yoyo数据库模式迁移器。
pip install yoyo-migrations
接下来,使用yoyo可执行文件完成所有迁移管理工作
yoyo new ./migrations -m "Add column to foo"
该命令创建一个文件,您可以在其中输入一个或多个迁移模式的说明。
from yoyo import step steps = [ step("CREATE TABLE foo (id INT, bar VARCHAR(20), PRIMARY KEY (id))", "DROP TABLE foo"), ]
迁移之后,您可以转到基础
yoyo apply --database postgresql://scott:tiger@localhost/db ./migrations
一切都很简单,就像日志一样。 同时,您可以完全完全控制数据库的外观。
这种方法有两个缺点。
- 表中的字段集及其参数必须紧随句柄。 每次更改都会导致需要自己编写ALTER TABLE ,一次单击就无法迁移所有内容的能力。
- 整合这些迁移也总是必须要动手做。 当然,这是多余的工作。 但是实际上,很少有冲突和迁移的复杂合并。
皮维

一个很小的但不是最受欢迎的ORM(尽管在这里已经多次写过),但是它有自己的受众。
Peewee被设计为数据库最愚蠢和最简单的包装器,具有最易懂的查询执行机制和易于阅读的代码。
Users.select().where( Users.user_id == user_id ).get()
尽管其简单,极简和少量代码,但peewee拥有理智工作所需的一切。
- 足够的性能(尽管不是最快的查询执行速度)
- 所有必需的东西-各种字段集,实体之间的关系,连接池,插件集和扩展集。
- 第三方peewee_async模块甚至增加了或多或少的合理异步。
小马orm
小马是传奇的包装器。 使用此ORM编写的数据库层有时可以加快其他解决方案的速度。 它的速度没有魔力,有一个非常称职的策略可以将请求缓存到数据库,优化堆和代码技巧。 总的来说,这导致了小马以马速炸薯条的事实。
负号可以在此ORM中称为查询语法-它非常具体,使用生成器,lambda和其他Python语言包子。
query = select(c for c in Customer if sum(o.total_price for o in c.orders) > 1000) Product.select().order_by(lambda p: desc(sum(p.order_items.quantity))).first()
这种方法需要一定程度的大脑衰竭。
乌龟orm

深入研究各种宠物友好的存储库,我发现了使用速度测量对不同ORM进行测试的集合 。 除了已经提到的Pony ORM外,某些Tortoise ORM出现在最快的列表中。 显然,测试结果取决于编写测试的人员以及测试的运行方式,但是您需要仔细研究一下。
乌龟是一个相对较年轻的项目,目前仍在积极开发中。 该库的良好性能是因为ORM不包含任何多余的东西,并且因异步而被立即开箱。 并且还假设使用uvloop ,它比事件的本机piton周期要快。
这个ORM仍然太原始了,无法在战斗中使用(例如,连接池甚至尚未实现),但是您应该查看此lib的开发。 如果开发人员一切顺利,那么在接下来的一年中,我们将为数据库提供一个非常快速的包装器,并且速度很快,并且语法没有Pony风格。