使用SQLAlchemy

时间:2015-09-05 14:55:27

标签: orm sqlalchemy

我一直在尝试各种方法来实现"字符串实习"在主要使用SQLAlchemy ORM访问的数据库中。我尝试了几件事,到目前为止,我并不喜欢他们中的任何一件事。这似乎是一种常见的模式,我觉得我可能会错过一些明显,优雅的解决方案。

详细说明:情况是我的数据库(Postgres,如果它很重要)表可能包含许多相同的字符串,但它们仍然是任意的,并且不受本地{{1}的限制。 } type将是正确的解决方案。我想在另一个表中使用自动递增PK收集这些字符串,然后由FK在主表中引用它们。这里的目标包括节省空间和字符串"卫生" (即我希望能够轻松评估和跟踪此字符串表的增长。)

我已经尝试过创建一个单独实体的显而易见的天真解决方案,但这似乎强制了实体的每个消费者实习的字符串的机制。即每个消费者都必须遍历关系以获取值,如下所示:enum并且缺少obj.interned_property.value提示,它会导致每次新访问都会出现另一个数据库命中。 (一般来说,我尝试将策略保持在模型本身之外,因为不同的用例通常会受益于不同的加载策略。)添加python属性来遍历关系不是一个好方法,因为它无法参与SQLAlchemy过滤/订购操作。

我已尝试使用AssociationProxy扩展程序,但我一直对此感到失望。我发现AssociationProxy属性不遵循其他SA ORM属性的相同元数据协定;例如,他们缺少joinedload属性。 info字典相对容易移植,但这只是第一个鞋子。之后,我发现您无法在查询中对其进行过滤(至少不会使用info运算符。)我已经达到了我有点厌倦的地步发现AssociationProxy属性 next 事物可以做

我接下来的想法是使用触发器和可更新视图在数据库内部进行所有实习,但这本身就阻碍了w / r / t数据库引擎的可移植性,并且在Python和PL / SQL之间拆分逻辑使得它变得更难为将来的开发人员进入此代码以弄清楚正在发生什么。而且,这是一大堆努力,所以如果我愿意这样做,我希望能够更加确信它是正确的方法。

无论如何,这似乎是一种非常普遍的模式,我觉得现在有人必须想出一个优雅的解决方案。所以,我很想听听之前曾经走过这条路的人:使用SQLAlchemy处理字符串实习的最佳方法是什么?

0 个答案:

没有答案