我想映射一個類有一個列,這並不真正存在,但只是一個SQL查詢時綁定參數的表達式。下面的模型是我想要做的一個例子。sqlalchemy列是SQL表達式與綁定參數
class House(db.Model):
__tablename__ = 'houses'
id = db.Column(db.Integer, primary_key=True)
@hybrid_property
def distance_from_current_location(self):
# what to return here?
return self.distance_from_current_location
@distance_from_current_location.expression
def distance_from_current_location(cls, latitude, longitude):
return db.func.earth_distance(
db.func.ll_to_earth(latitude, longitude), cls.earth_location)
# defer loading, as the raw value is pretty useless in python
earth_location = deferred(db.Column(EARTH))
然後我想通過燒瓶SQLAlchemy的查詢:
latidude = 80.20393
longitude = -90.44380
paged_data = \
House.query \
.bindparams({'latitude': latitude, 'longitude': longitude}) \
.paginate(1, 20, False)
我的問題是:
- 我如何做到這一點?是否有可能使用這樣的hybrid_property?
- 如果我可以使用hybrid_property,python方法應該返回什麼? (沒有python的方式來解釋這個,它應該只是返回任何數據庫表達式返回
- 緯度和經度只存在於查詢時間,並且需要爲每個查詢綁定如何在查詢時間綁定緯度和經度?在我的代碼
bindparams
位代碼片段我只是做了,但它說明了我想做的事情。是否有可能做到這一點?
我讀過的文檔,但無法找到任何hybrid_property或方法與示例中的綁定參數...
(也因爲這不是一個真正的列,但只是我想在我的模型上使用的東西,我不希望這觸發alembic t o爲它生成一個新列)。
謝謝!
權,是啊...我想這只是術語在這裏。通過假專欄我的意思是,它不是真正的專欄,我可以做'選擇ID,earth_distance(ll_to_earth(...),...)' 我試着沿着'hybrid_property'或'hybrid_method '路徑,但是既然沒有有意義的python代碼可以寫,那麼它們都不能工作......我只想從DB獲取值。 我最後去了'with_entities()'路線,我試圖避免它,因爲當我需要處理返回的行時,它使得代碼在事物的Python方面不太方便和更加混亂。但它有效,那纔是重中之重。 – lostdorje