SQLAlchemy — ограничить количество связей, запрашиваемых по глубине

#python #database #join #orm #sqlalchemy

#python #База данных #Присоединиться #orm #sqlalchemy

Вопрос:

У меня есть 3 модели — A (корневая), B (дочерняя), C (внучатая)

 from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class A(db.Model):
    __tablename__ = 'A'

    a_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)

    # Specifying relationship to B
    b_id = db.Column(db.ForeignKey('B.b_id', ondelete='CASCADE'), index=True)
    b = db.relationship('B', primaryjoin='A.b_id == B.b_id', 
    lazy="joined", innerjoin=True, join_depth=1)

class B(db.Model):
    __tablename__ = 'B'

    b_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)
    
    # Specifying relationship to C
    c_id = db.Column(db.ForeignKey('C.c_id', ondelete='CASCADE'), index=True)
    c = db.relationship('C', primaryjoin='B.c_id == C.c_id', 
    lazy="joined", innerjoin=True, join_depth=1)

class C(db.Model):
    __tablename__ = 'C'

    c_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)

  

Цель состоит в том, чтобы получить только A и B, когда я запрашиваю (используя all() ) для A. Я использовал опции lazy=joined и join_depth=1 .

Это действительно разбивает запрос на несколько частей, так что каждая из них не имеет более одного соединения. Но он запускает несколько запросов и также присоединяется к C.

Итак, два вопроса:

  1. Как мне убедиться, что я извлекаю только A и B, даже если C связан?
  2. В общем случае, могу ли я гарантировать, что извлекаются только модели до определенной глубины?

join_depth похоже, это имеет смысл, но было бы здорово, если бы это остановилось всего на одном запросе.