Orm 使用SQLAlchemy进行字符串实习

Orm 使用SQLAlchemy进行字符串实习,orm,sqlalchemy,Orm,Sqlalchemy,我在一个主要使用SQLAlchemy ORM访问的数据库中尝试了各种“字符串实习”方法。我试过几件事,到目前为止,我一件也不喜欢。这似乎是一个常见的模式,我觉得我可能错过了一些明显的、优雅的解决方案 详细说明:情况是,我的数据库(Postgres,如果有关系的话)表可能包含许多相同的字符串,但它们仍然是任意的,并且没有以本机enum类型为正确解决方案的方式进行绑定。我想用一个自动递增的PK在另一个表中收集这些字符串,然后用FK在主表中引用它们。这里的目标包括节省空间和字符串“卫生”(即,我希望能

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

详细说明:情况是,我的数据库(Postgres,如果有关系的话)表可能包含许多相同的字符串,但它们仍然是任意的,并且没有以本机
enum
类型为正确解决方案的方式进行绑定。我想用一个自动递增的PK在另一个表中收集这些字符串,然后用FK在主表中引用它们。这里的目标包括节省空间和字符串“卫生”(即,我希望能够轻松评估和跟踪此字符串表的增长)

我曾经尝试过创建一个单独实体的简单解决方案,但这似乎将字符串的机制强加给了实体的每个消费者。i、 e.每个使用者都必须遍历关系以获取值,如下所示:
obj.interned_property.value
如果没有
joinedload
提示,则每次新访问都会导致另一个数据库命中。(一般来说,我试图将加载策略排除在模型之外,因为不同的用例通常受益于不同的加载策略。)添加python属性来遍历关系不是一个好方法,因为它不能参与SQLAlchemy筛选/排序操作

我尝试过使用AssociationProxy扩展,但我对它普遍感到失望。我发现AssociationProxy属性与其他SA ORM属性不遵循相同的元数据约定;例如,它们缺少
info
属性。一本
info
字典移植起来相对简单,但这实际上只是第一只鞋。在那之后,我发现在查询中不能对它们进行过滤(至少不能使用
LIKE
操作符)。我已经到了一个地步,我有点厌倦了发现AssociationProxy属性不能做的下一件事

我的下一个想法是使用触发器和可更新视图在数据库中进行所有的内部实习,但这本身就妨碍了可移植性w/r/t数据库引擎,并将Python和PL/SQL之间的逻辑分割开来,这使得未来的开发人员更难理解这段代码中发生了什么。而且,这是一系列的努力,所以如果我要去做的话,我想更自信地认为这是正确的方式


不管怎么说,这似乎是一个非常普遍的模式,我觉得现在一定有人想出了一个优雅的解决方案。所以,我很想听听以前在这条路上走过的人:处理SQLAlchemy的字符串的最佳方法是什么?

你有没有考虑为你的模型添加一个Culnnl属性?它只解决了问题的查询部分,而不是维护部分。是的,我在几个地方使用了
column\u属性
来表示表达式值,所以我对它们很熟悉。我认为在
column_property
AssociationProxy
之间,后者与我想要的更接近,但与开发人员阻抗上下文中的DB端解决方案相比,它仍然相形见绌。我猜,在这一点上,一个平滑的字符串实习解决方案可能意味着开发一个非平凡的SQLAlchemy扩展(