簡體   English   中英

創建一個允許“ in_”運算符的sqlalchemy hybrid_property

[英]Creating an sqlalchemy hybrid_property that allows for “in_” operator

你會如何做一個hybrid_property允許in_條款? SQLAlchemy expression什么樣的?

class Version(Base):
    version_id = Column(Integer, primary_key=True)
    package_id = Column(Integer, ForeignKey('package.package_id')
    version = Column(String(32), index=True)

    @hybrid_property
    def pkg_id_concat_vers(self):
        # "23~~0.2.4"
        return "{}~~{}".format(self.package_id, self.version)

# TODO
#@pkg_id_concat_vers(self):
#    pass

# Using the naive `(not) in` doesn't actually apply the filter
data = ['23~~0.2.4', '57~~0.0.1']
result = (session.query(Version)
          .filter(Version.pkg_id_concat_vers in data)
          ).all()

# Using `in_()` throws an Attribute Error, as it's a string.
data = ['23~~0.2.4', '57~~0.0.1']
result = (session.query(Version)
          .filter(Version.pkg_id_concat_vers.in_(data))
          ).all()

SQLAlchemy在類型為String表達式上支持+運算符,因此您可以將列轉換為String ,然后執行以下操作:

@pkg_id_concat_vers.expression
def pkg_id_concat_vers(cls):
    return cast(cls.package_id, String) + "~~" + cast(cls.version, String)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM