在 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)
问题
我现在想搜索 small
和 red
衬衫,利用 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))
背景
我在 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()
是的,应该使用索引。 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))