我在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
复合索引搜索red
和color_size
衬衫。
如何撰写此查询?
使用and_()
会自动利用索引吗?
例如:
results = Shirt.query.filter( and_(Shirt.size=='small', Shirt.color=='red') ).all()
答案 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))