Python 使用子查询技术将SQLAlchemy模型与特定条件连接起来
我有一个API,它处理跨越多个表的大量数据。 根据客户机的请求,服务器需要通过连接所有相关表来获取记录,并为响应提供服务 我已通过以下方式在Alchemy中定义了我的模型:Python 使用子查询技术将SQLAlchemy模型与特定条件连接起来,python,sqlalchemy,orm,flask-sqlalchemy,Python,Sqlalchemy,Orm,Flask Sqlalchemy,我有一个API,它处理跨越多个表的大量数据。 根据客户机的请求,服务器需要通过连接所有相关表来获取记录,并为响应提供服务 我已通过以下方式在Alchemy中定义了我的模型: class AttributeInfo(db.Model): __tablename__ = 'attribute_info' id = Column(Integer, primary_key=True) attribute_start_date = Column(Date) attribu
class AttributeInfo(db.Model):
__tablename__ = 'attribute_info'
id = Column(Integer, primary_key=True)
attribute_start_date = Column(Date)
attribute_end_date = Column(Date)
attributes = relationship('Attribute', lazy='subquery')
patterns = relationship('AttributePattern', lazy='subquery')
split = relationship('AttributeSplit', lazy='subquery')
class Attribute(db.Model):
__tablename__ = 'attribute_main'
id = Column(Integer, primary_key=True)
attribute_name = Column(String)
attribute_value = Column(String)
attribute_id = Column(Integer, ForeignKey('attribute_info.id'))
class AttributePattern(db.Model):
__tablename__ = 'attribute_pattern'
id = Column(Integer, primary_key=True)
attribute_id = Column(Integer, ForeignKey('attribute_info.id'))
attribute_name = Column(String)
attribute_pattern_level1 = Column(String)
attribute_pattern_level2 = Column(String)
attribute_pattern_level3 = Column(String)
class AttributeSplit(db.Model):
__tablename__ = 'attribute_split'
id = Column(Integer, primary_key=True)
attribute_id = Column(Integer, ForeignKey('attribute_info.id'))
split_attribute1 = Column(String)
split_attribute2 = Column(String)
split_attribute3 = Column(String)
split_attribute4 = Column(String)
我认为在生成子查询时,使用子查询进行急切加载是最好的方法
以下查询:
当我使用如下分页方式执行查询操作时:
AttributeInfo.query.filter(AttributeInfo.id.in.[40,45])
SELECT id, attribute_start_date, attribute_end_date
FROM attribute_info
WHERE id IN (40, 45)
LIMIT 100 OFFSET 0;
SELECT id, split_attribute1, split_attribute2, split_attribute3, split_attribute4, anon_1.id
FROM (
SELECT id
FROM attribute_info
WHERE id IN (40, 45)
LIMIT 100 OFFSET 0
) AS anon_1
JOIN attribute_split ON anon_1.id = attribute_split.attribute_id;
SELECT id, attribute_name, attribute_pattern_level1, attribute_pattern_level2, attribute_pattern_level3, anon_1.id
FROM (
SELECT id
FROM attribute_info
WHERE id IN (40, 45)
LIMIT 100 OFFSET 0
) AS anon_1
JOIN attribute_pattern ON anon_1.id = attribute_pattern.attribute_id;
SELECT id, attribute_name, attribute_value, anon_1.id
FROM (
SELECT id
FROM attribute_info
WHERE id IN (40, 45)
LIMIT 100 OFFSET 0
) AS anon_1
JOIN attribute_main ON anon_1.id = attribute_main.attribute_id;
SELECT count(*) AS count_1
FROM (
SELECT id,
attribute_start_date,
attribute_end_date
FROM attribute_info
WHERE id IN (40, 45)
为了便于阅读,我已从查询中删除了不需要的前缀。
但是,我想为每个查询添加某些条件,如:
SELECT id, attribute_name, attribute_value, anon_1.id
FROM (
SELECT id
FROM attribute_info
WHERE id IN (40, 45)
LIMIT 100 OFFSET 0
) AS anon_1
JOIN attribute_main ON anon_1.id = attribute_main.attribute_id
WHERE attribute_name in ('attribute_name_1', 'attribute_name_2', 'attribute_name_3')
我怎样才能做到这一点呢?你需要