python – 在SQLAlchemy中按对象过滤
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在SQLAlchemy中按对象过滤,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1930字,纯文字阅读大概需要3分钟。
内容图文
我有一个声明的模型,表中存储了一个对象的“原始”路径标识符.然后我有一个@hybrid_property,它允许直接获取和设置由该字段标识的对象(这不是另一个声明性模型).有没有办法直接在这个高级别查询?
我可以做这个:
session.query(Member).filter_by(program_raw=my_program.raw)
我希望能够这样做:
session.query(Member).filter_by(program=my_program)
其中my_program.raw ==“path / to / a / program”
成员有一个字段program_raw和一个属性程序,它获取正确的Program实例并设置适当的program_raw值.程序有一个简单的原始字段,可以唯一标识它.如有必要,我可以提供更多代码.
问题是,目前,SQLAlchemy只是尝试将程序实例作为参数传递给查询,而不是原始值.这会导致错误绑定参数0 – 可能不受支持的类型.错误.
>或者,SQLAlchemy需要知道在比较程序时,它必须使用Member.program_raw并将其与参数的原始属性进行匹配.让它使用Member.program_raw只是使用@ program.expression完成,但我无法弄清楚如何正确翻译Program参数(使用Comparator?),和/或
> SQLAlchemy应该知道,当我按程序实例过滤时,它应该使用raw属性.
我的用例可能有点抽象,但想象一下,我在数据库中存储了一个序列化的RGB值,并在模型上有一个带有Color类的属性.我想通过Color类进行过滤,而不必处理我的过滤器中的RGB值.颜色类没有问题告诉我它的RGB值.
解决方法:
通过阅读关系来源找出它.诀窍是为属性使用自定义Comparator,它知道如何比较两件事.就我而言,它很简单:
from sqlalchemy.ext.hybrid import Comparator, hybrid_property
class ProgramComparator(Comparator):
def __eq__(self, other):
# Should check for case of `other is None`
return self.__clause_element__() == other.raw
class Member(Base):
# ...
program_raw = Column(String(80), index=True)
@hybrid_property
def program(self):
return Program(self.program_raw)
@program.comparator
def program(cls):
# program_raw becomes __clause_element__ in the Comparator.
return ProgramComparator(cls.program_raw)
@program.setter
def program(self, value):
self.program_raw = value.raw
注意:在我的情况下,Program(‘abc’)== Program(‘abc’)(我已经覆盖__new__),所以我可以一直返回一个“新”程序.对于其他情况,实例应该可以延迟创建并存储在Member实例中.
内容总结
以上是互联网集市为您收集整理的python – 在SQLAlchemy中按对象过滤全部内容,希望文章能够帮你解决python – 在SQLAlchemy中按对象过滤所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。