【发布时间】:2020-09-21 13:03:43
【问题描述】:
我有以下 SQLA 模型和关系。我每秒都在记录每个通道的测量值,因此数据库中有很多测量值。
class Channel( Model ) :
__tablename__ = 'channel'
id = Column( Integer, primary_key=True )
#! --- Relationships ---
measurements = relationship( 'Measurement', back_populates='channel', lazy='dynamic' )
class Measurement( Model ) :
__tablename__ = 'measurement'
id = Column( Integer, primary_key=True )
timestamp = Column( DateTime, nullable=False )
value = Column( Float, nullable=False )
#! --- Relationships ---
channel = relationship( 'Channel', back_populates='measurements', uselist=False )
如果我想获得最新的测量值,我可以通过 ORM 获得它并使用 负索引 进行切片。
channel.measurements[-1]
但是,它非常非常慢!!
我可以使用.filter() 和.order_by() 等进一步过滤关系查询,以获得我想要的,但我喜欢使用ORM(为什么要不然?)
我注意到,如果我使用 正索引 进行切片,它会很快(类似于上面提到的显式 SQLA 查询)。
channel.measurements[0]
我更改了关系以保持measurements 的相反顺序,这似乎与使用零索引结合使用。
measurements = relationship( 'Measurement', back_populates='channel', lazy='dynamic', order_by='Measurement.id.desc()' )
那么,为什么负索引切片这么慢?
这是 SQLAlchemy 中的错误吗?我会认为执行正确的 SQL 以仅从数据库中获取最新项目会足够聪明?
我还需要做些什么来让测量按自然顺序排序并使用负索引切片并获得与其他方法相同的速度吗??
【问题讨论】:
标签: orm sqlalchemy slice negative-integer