首页 > 解决方案 > SQLAlchemy 查询,其中比较多列的元组

问题描述

我有一个查询需要在我的应用程序中支持分页。

def get_paginated_items(
        self,
        limit: int,
        last_shipment_time: int = MAX_INT,
        last_item_id: int = MAX_INT,
    s = (
        select([self.items])
        .where((
            self.items.c.shipment_time,
            self.items.c.item_id,
        ) < (
            last_shipment_time,
            last_item_id,
        ))
        .order_by(
            self.items.c.shipment_time.desc(),
            self.items.c.item_id.desc(),
        )
        .limit(limit)
    )
    with self.get_connection() as connection:
        result = connection.execute(s)
        return result.fetchall()

如果两个项目具有相同shipment_time的 ,item_id则应使用 来打破比较中的平局。

显然 SQL 对此有支持(https://stackoverflow.com/a/52376813/1639564)。但是,当我使用此查询时,它似乎忽略了元组的第二个元素。

我正在为数据库使用 SQLite。

标签: pythonsqlitesqlalchemy

解决方案


您需要在 where 条件中指定您正在使用元组:

from sqlalchemy import tuple_

def get_paginated_items(
        self,
        limit: int,
        last_shipment_time: int = MAX_INT,
        last_item_id: int = MAX_INT,
    s = (
        select([self.items])
        .where(tuple_(
            self.items.c.shipment_time,
            self.items.c.item_id,
        ) < tuple_(
            last_shipment_time,
            last_item_id,
        ))
        .order_by(
            self.items.c.shipment_time.desc(),
            self.items.c.item_id.desc(),
        )
        .limit(limit)
    )
    with self.get_connection() as connection:
        result = connection.execute(s)
        return result.fetchall()

推荐阅读