在 SQLAlchemy-ORM 中查询组合键

Querying a composite key in SQLAlchemy-ORM

背景

我在 SQLAlchemy 对象上定义了一个复合索引,比如:

class Shirt(Base):
    __tablename__ = 'shirt'
    id = Column(Integer, primary_key=True)
    size = Column(String(32))   # e.g. small, medium large
    color = Column(String(32))  # e.g. blue, red, white

Index('color_size', Shirt.size, Shirt.color)

问题

我现在想搜索 smallred 衬衫,利用 color_size 复合索引。

如何编写此查询?

使用and_()会自动利用索引吗?
例如:

results = Shirt.query.filter( and_(Shirt.size=='small', Shirt.color=='red') ).all()

是的,应该使用索引。 SQLAlchemy 虽然没有使用索引,但它只定义了索引。将其用于给定查询取决于数据库。

可以用EXPLAIN来证明索引被使用了。例如,PostgreSQL 显示 Index Scan.

example => explain select id from shirt where color = 'red' and size = 'small';
                                    QUERY PLAN                                    
----------------------------------------------------------------------------------
 Index Scan using ix_shirt_size_color on shirt  (cost=0.15..8.17 rows=1 width=4)
   Index Cond: (((size)::text = 'small'::text) AND ((color)::text = 'red'::text))

假设您的模型 class 被称为 Shirt 并且(大小,颜色)是复合主键:

您可以通过以下方式查询:

import sqlalchemy
...
Example.query.get((size, color))

import sqlalchemy
from sqlalchemy.orm import sessionmaker
...
engine = sqlalchemy.create_engine('postgresql://user:pass@localhost/db_name')
session = sessionmaker(bind=engine)()
session.query(Example).get((size, color))