【问题标题】:Is it possible to query SQLAlchemy Joined Table Inheritance with and condition是否可以使用和条件查询SQLAlchemy Joined Table Inheritance
【发布时间】:2023-01-26 08:46:25
【问题描述】:

使用平面模型,可以进行以下连接: session.query( EmployeeModel.name, EmployeeDepartment.dept_name ).join( EmployeeDepartment, and_( EmployeeDepartment.employee_id == EmployeeModel.id, EmployeeDepartment.dept_code == 'P01' ) ).all()

在我的例子中,我有以下继承层次结构: `父类(基础):tablename= '父母'

id = Column(BigInteger, primary_key=True)
cls = Column(String(255), nullable=False, index=True)
sub2_id = Column(ForeignKey('parent.id'),
                                  unique=True)
extended_id = Column(
    ForeignKey('extended.id'), index=True)
extended = relationship('Extended')

Sub1 类(父类):tablename= 'sub1'

sub1_id = Column(ForeignKey('parent.id'),
                           primary_key=True)

类 Sub2(Sub1):tablename= 'sub2'

sub2_id = Column(
    ForeignKey('sub1.sub1_id'), primary_key=True)

扩展类(基础):tablename= '扩展'

id = Column(BigInteger, primary_key=True)
classname = Column(String(255), nullable=False, index=True)

`

我正在尝试实现以下 SQL 本机查询:

SELECT sub2.sub2_id AS sub2_sub2_id FROM parent JOIN sub1 ON parent.id = sub1.sub1_id AND parent.cls = 'MAIN' JOIN sub2 ON sub1.sub1_id = sub2.sub2_id JOIN extended ON extended.id = parent.extended_id

但是下面的查询结果将是:

query = db.session.query(Sub2.sub2_id).join(Extented)

SELECT sub2.sub2_id AS sub2_sub2_id FROM parent JOIN sub1 ON parent.id = sub1.sub1_id JOIN sub2 ON sub1.sub1_id = sub2.sub2_id JOIN extended ON extended.id = parent.extended_id

是否可以自定义模型或关系来实现所需的查询?

感谢您的帮助。

我曾尝试将和条件添加到关系中,但这没有帮助。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    是的,可以自定义模型和关系以实现所需的查询。您可以使用 filter() 方法或 filter_by() 方法为连接添加过滤条件。

    以下是如何使用 filter() 方法向连接添加过滤条件的示例:

    from sqlalchemy import and_
    
    query = db.session.query(Sub2.sub2_id).join(Extented, and_(Parent.cls == 'MAIN', Parent.id == Sub1.sub1_id))
    

    这会将过滤条件 Parent.cls = 'MAIN' 和 Parent.id = Sub1.sub1_id 添加到连接中,从而产生所需的查询。

    或者,您可以使用 filter_by() 方法为连接添加过滤条件:

    query = db.session.query(Sub2.sub2_id).join(Extented).filter_by(cls='MAIN', id=Sub1.sub1_id)
    

    这将具有与第一个示例相同的效果。

    重要的是要注意 filter 方法和 filter_by 方法不仅用于连接,而且您可以使用它们来过滤任何查询。

    查看更多:https://docs.sqlalchemy.org/en/14/core/sqlelement.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2012-11-14
      • 2012-03-04
      相关资源
      最近更新 更多