我在SQLAlchemy中使用关联代理,以避免不断加入仅包含Entity
的表name
),entity_proper_name
:
class Institution(Base):
entity_id = Column(
String(8, u'SQL_Latin1_General_CP1_CI_AS'),
ForeignKey(Entity.entity_id),
primary_key=True)
entity = relationship(Entity, uselist=False)
name = association_proxy('entity', 'entity_proper_name')
我可以使用==
查询课程,但不能使用.like
:
query = s.query(Institution).filter(Institution.name=='Correct Name')
# works fine
query = s.query(Institution).filter(Institution.name.like('%Correct N%')
# AttributeError: 'AssociationProxy' object has no attribute 'like'
有没有办法使用.like
,而不拒绝关联代理方法?
答案 0 :(得分:2)
问题很旧-没有答案...而且似乎还没有找到一个好的解决方案。
我只是遇到了同样的问题,并且执行了以下操作:
from sqlalchemy.ext.associationproxy import AssociationProxy
def like_filter(attr, *args, **kwargs):
filter_attr = attr
if isinstance(filter_attr, AssociationProxy): # If assoc_proxy get remote_attr as like() doesnt work
filter_attr = filter_attr.remote_attr
return filter_attr.like(*args, **kwargs)
现在,我可以这样做:
s.query(Institution).filter(like_filter(Institution.name, '%Correct N%'))
不理想。绝对是一种解决方法。但是有效:)