在自定义方法上使用hybrid_property使用Sqlalchemy表达式

时间:2015-05-15 16:25:30

标签: python mysql python-2.7 sqlite sqlalchemy

我希望创建一个查询表,并根据某些calc_dist(属性)函数计算表中给定位置和存储的Geo位置属性之间的差异,该函数在运行中过滤它并返回切片中的结果从最近到最远

假设表类类似于:

Hoo(Base):
    attribute_names = Column(......)

    @hybrid_property
    def calc_dist(self):
        #do some foo(self.attr_) 

如何做以下事情:

session.query(Hoo).filter(Hoo.attr_ and given_geo_loc USING this location value- Is there a way to pass this val into calc_dist here?)

每次有新的Give Geo Location请求进入时,我们如何使用这个Given位置将其传递给过滤器查询,以便calc_dist计算出来?

对于每个给定的位置参数,会有一个切片的查询结果,根据此极限从最近到最远得到值。

更新

This真有帮助

我尝试使用它来解决我的问题:

class Hoo(Base):
    #Table info
    __tablename__ = 'hoo'
    #mappers
    lat = Column(String(50))
    lng = Column(String(50))

    @hybrid_method
    def rankByloc(self, lat, lng):
        return haversine((float(self.lat), float(self.lng)), (float(lat), float(lng)))

    @rankByloc.expression
    def rankByloc(cls, lat, lng):
        return haversine((float(self.lat), float(self.lng)), (float(lat), float(lng)))

当我这样做时

session.query(Hoo).order_by(Hoo.rankByloc(lat, lng))

给出错误:

NameError: global name 'self' is not defined

当我将其更改为@hybrid_property

它说

TypeError: rankByloc() takes exactly 3 arguments (1 given)

更新#2

好的我正在使用hybrid_method。 但是表达式描述符中的python函数不起作用。即需要改变:

 @rankByloc.expression
        def rankByloc(cls, lat, lng):
            return haversine((float(self.lat), float(self.lng)), (float(lat), float(lng)))

更新#3

所以我正在查看this,并找出如何使用独立于供应商的Sqlalchemy的等效存储过程,并从orderby调用hasrsine函数。

除了逻辑运算符之外,是否可以使用SQLA类的Class属性之外的外部函数调用?我的意思是我想在不在sql对象上的值上运行函数。

0 个答案:

没有答案