Python 使用子查询技术将SQLAlchemy模型与特定条件连接起来

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

我有一个API,它处理跨越多个表的大量数据。 根据客户机的请求,服务器需要通过连接所有相关表来获取记录,并为响应提供服务

我已通过以下方式在Alchemy中定义了我的模型:

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')
我怎样才能做到这一点呢?

你需要