寻找特定的python ORM

时间:2018-03-16 16:19:41

标签: python python-3.x orm sqlalchemy ponyorm

我刚刚继承了一个极端的遗留应用程序(基于Windows 95构建 - 适用于鉴赏家的Magic7),现在支持最近的mssql db(2012)。这不是它最初设计的数据库系统,因此它为表格提供了一些非常奇怪的设计。

我正在寻找一个python ORM来帮助我轻松地谈论这件事。也就是说,我正在使用ORM,例如,可以很容易地将两个表合并为一个。

例如,我可能有表BILLS和BILLS_HISTORY,具有不同的列名,甚至可能有不同的列类型,严格来说不同,但是在语义上包含相同的信息(相同的列数,不同的值)。

我正在寻找一个ORM,它允许我只定义一个Bill对象,映射到两个表,这给了我正确的钩子来决定事情的进展,以及如何在需要调整时编写它们。

另一个例子:说我有一个叫好的对象。如果商品已经完成,则进入GOODS表,如果没有完成,则进入GOODS_UNFINISHED表。我正在寻找一个可以读取两个表的货物对象,并根据它来自哪个表给我一个完成的属性设置为正确的值(并且如果设置了属性,则使用钩子将其从一个表更改为另一个表在某种程度上。)

我对python很好,但是之前我没有做过很多这样的数据库工作,因此我的知识有限。我可以,也可能最终编写我自己定制的ORM,但这似乎是浪费时间在6个月内完全转换到新事物时会丢弃的东西。有没有人知道具有这种功能的ORM?我打算学习ponyORM和SQLAlchemy,但我觉得我需要几天才能得出结论,因为它们适合我的用例。所以我以为我也会问社区......

干杯

1 个答案:

答案 0 :(得分:0)

为了记录,我最终使用了sqlalchemy的混合方法。

Sqlalchemy不够灵活,无法以非冗长的方式完成我想做的所有事情,但是,如果有人不愿意显式地编写所需的所有内容,则它具有所需的功能,可以实现相当多的发展。因此,我编写了一个程序,该程序生成约6000行sqlalchemy代码,以便以所需的方式(基本上为sqla明确定义所有内容)在sqlalchemy对象与表之间进行一对一的映射。 Sqlalchemy在自动加载期间有很多钩子,但是我发现很难/不可能利用不同的钩子并同时在每个钩子上设置细粒度的行为,这就是为什么我采用了自动显式方式。

在这些sqlalchemy对象之上,我编写了将它们包装起来以隐藏“哪个表”流量控制对象的对象。有点纠结,我认为我可以用类型继承和sqlachemy对象做一些事情,但是时间在流逝,我只需要很少的功能性或可维护性,因此只需要提前付费即可。