#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.
Итак, два вопроса:
- Как мне убедиться, что я извлекаю только A и B, даже если C связан?
- В общем случае, могу ли я гарантировать, что извлекаются только модели до определенной глубины?
join_depth
похоже, это имеет смысл, но было бы здорово, если бы это остановилось всего на одном запросе.