在SQLAlchemy-ORM中查询复合键

时间:2015-03-31 19:17:42

标签: python sqlalchemy flask-sqlalchemy composite-key

背景

我在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)

问题

我现在想利用small复合索引搜索redcolor_size衬衫。

如何撰写此查询?

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

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

2 个答案:

答案 0 :(得分:1)

是的,应该使用索引。 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))

答案 1 :(得分:1)

假设您的模型类称为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))