我有以下 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 以仅从数据库中获取最新项目会足够聪明吗?
我还需要做些什么来按自然顺序对测量进行排序并使用负索引切片并获得与其他方法相同的速度吗?