我在SQLAlchemy中有一个ORM模型,该模型存储一些价格(按product_id和date)和汇率(按currency_from,currency_to和date)。我有一个返回查询对象的函数。该查询具有id,日期,货币和价格列。可以选择将价格转换为其他货币。我想将此查询对象作为参数,并将其与ExRates
表联接,以转换为其他货币。
我使用的一种解决方法是读取pandas.DataFrame
和合并所需的部分。另一个棘手的部分是,有时候我有星期六的价格,但没有汇率。在这种情况下,应使用最后可用的汇率。同样,我可以在pandas
中使用.reindex
和.fillna(method='ffill')
来实现,但是我想纯粹在SQL中实现它。
下面供我参考的是代码中的内容:
class Price(ReprMixin, GenFromDfMixin, ToDfMixin, Base):
__tablename__ = 'prices'
benchmark_id = Column(String, ForeignKey('benchmarks.benchmark_id'), index=True, primary_key=True)
date = Column(Date, index=True, primary_key=True)
price = Column(Float)
return_ytd = Column(Float)
class Benchmark(ReprMixin, GenFromDfMixin, ToDfMixin, Base):
__tablename__ = 'benchmarks'
benchmark_id = Column(String, primary_key=True)
index_name = Column(String)
currency = Column(String)
...
class ExRate(ReprMixin, GenFromDfMixin, ToDfMixin, Base):
__tablename__ = 'rates'
cur_from = Column(String, primary_key=True)
cur_to = Column(String, primary_key=True)
date = Column(Date, primary_key=True, index=True)
ex_rate = Column(Float)
def _query_by_id_and_date(benchmark_id, date_min=None, date_max=None):
if date_min is None:
date_min = datetime.date(1900, 1, 1)
if date_max is None:
date_max = datetime.date(2222, 1, 1)
prices = dal.session.query(Price.benchmark_id, Price.date, Price.price, Benchmark.currency).join(Benchmark)\
.filter(Price.benchmark_id == benchmark_id).filter(Price.date.between(date_min, date_max))
return prices
def _currency_convert(q, to_curr):
pass
# I would like to call this function like this:
# _currency_convert(_query_by_id_and_date('some_id'), 'EUR')
# and get the same 4 column query, but with prices converted to a new currency
答案 0 :(得分:1)
我不确定我是否正确理解了您的问题。我认为您正在尝试根据不同的货币转换价格。试试看
from sqlalchemy import and_
query=session.query(Price.benchmark_id,Price.date,Price.return_ytd,Price.price*ExRate.ex_rate)\
.join(Benchmark)\
.join(ExRate, ExRate.cur_from==Benchmark.currency)\
.filter(and_(ExRate.cur_from==Benchmark.currency, ExRate.cur_to=='EUR')