我目前正忙于制作一个 Python ORM,它通过自省(introspection)从 RDBMS 获取所有信息(如果我在其他方面对它感到满意,我会选择 XRecord)——意思是,最终用户只告诉哪些表/views 来查看,ORM 会自动完成其他所有事情(如果它让你真的写了一些东西并且你不是在寻找奇怪的东西和危险的冒险,那就是一个错误)。
其中的主要部分是检测关系,前提是数据库具有所有相关的约束并且你根本没有命名约定——我希望能够让这个 ORM 与任何疯狂的 DBA 创建的数据库一起工作对于列和表的命名方式有他自己的看法。我被困在多对多关系中。
首先,可以有复合键。然后,可以有与三个或更多表的 MTM 关系。然后,MTM 中间表可能有它自己的除了键之外的数据——它绑定(bind)在一起的所有表共有的一些数据。
我想要的是一种以编程方式检测表 X 是连接表 A 和 B 的中间表的方法,并且它拥有的任何非键数据必须同时属于 A 和 B(如果我更改公共(public)属性从 A 中,它应该影响 B) 中的相同属性。有没有通用的算法来做到这一点?或者至少在 80% 的情况下做出正确的猜测(前提是 DBA 是理智的)?
请您参考如下方法:
如果你不得不问,你不应该这样做。我并不是说这很残忍,但是 Python 已经有几个经过良好测试和广泛使用的优秀 ORM。例如,SQLAlchemy 在定义表时支持 autoload=True 属性,这使得它可以直接从数据库中读取表定义——包括你所询问的所有内容。当其他人已经完成 99.9% 的工作时,为什么还要重新发明轮子?
我的答案是选择一个 Python ORM(例如 SQLAlchemy)并向其添加任何“缺失”的功能,而不是从头开始。如果结果证明这是个好主意,请将您的更改发布回主项目,以便其他人都能从中受益。如果它没有像您希望的那样工作,至少您已经在使用许多其他程序员可以帮助您的通用 ORM。
