SQLAlchemy:一个select正在对Postgres DB执行多项选择

时间:2017-12-14 00:57:25

标签: python postgresql sqlalchemy flask-sqlalchemy

任何具有更深入SQLAlchemy知识的人都可以解释为什么它似乎向DB发送多个查询而不仅仅是如下所述的那个查询?

查询如下所示:

session.query(Orders).filter(
    Orders.user_id == user_id,
    Orders.created_on <= now,
    Orders.created_on > 30_days_ago
).order_by(
    Orders.status, 
    Orders.created_on.desc()
).all()

(Orders.status只是一个整数,如1 =&gt;&#34;发货&#34; 2 =&gt;&#34;完成&#34; 3 =&gt;&#34;返回&#34;)< / p>

我期望向DB发出一个单独的查询,其逻辑与(在Postgres中)逻辑相同:

SELECT *
FROM Orders
WHERE
    user_id = :user_id and
    created_on < now() and
    created_on >= now() - interval '30 days'
ORDER BY status, created_on DESC;

假设上面的查询返回10行,其中id为1-11。 从Postgres日志中发现到数据库的实际内容是针对每行检索的单个查询。

SELECT *
FROM Orders
WHERE id = 1;

SELECT *
FROM Orders
WHERE id = 2;

SELECT *
FROM Orders
WHERE id = 3;

... 

最后不得不使用session.execute()代替session.query()。幸运的是,在这种情况下,应用程序不依赖于会话是最新的。

编辑 - 添加有关订单模型的更多信息

Base = declarative_base()

class Orders(Base)
    __tablename__ = "Orders"

    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, nullable=False, index=True)
    name = Column(String, nullable=False, index=True, index=True)
    category = Column(String, nullable=False)
    status = Column(Float, nullable=False)
    created_on = Column(DateTime, nullable=False)

    def __init__(self, user_id, name, category, status, created_on):
        self.user_id = user_id
        self.name = name
        self.category = category
        self.status = priority
        self.created_on = datetime.datetime.utcnow()

该表在user_id列和名称列上有一个索引。

0 个答案:

没有答案