หลายคำถามใน sqlalchemy

Oct 16 2020

มีตารางสำหรับคำถามของฉัน

class TemplateExtra(ExtraBase, InsertMixin, TimestampMixin):
    __tablename__ = 'template_extra'

    id = Column(Integer, primary_key=True, autoincrement=False)
    name = Column(Text, nullable=False)
    roles = relationship(
        'RecipientRoleExtra',
        secondary='template_to_role',
    )


class RecipientRoleExtra(
    ExtraBase, InsertMixin, TimestampMixin,
    SelectMixin, UpdateMixin,
):
    __tablename__ = 'recipient_role'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Text, nullable=False)
    description = Column(Text, nullable=False)


class TemplateToRecipientRoleExtra(ExtraBase, InsertMixin, TimestampMixin):
    __tablename__ = 'template_to_role'

    id = Column(Integer, primary_key=True, autoincrement=True)
    template_id = Column(Integer, ForeignKey('template_extra.id'))
    role_id = Column(Integer, ForeignKey('recipient_role.id'))

ฉันต้องการเลือกเทมเพลตทั้งหมดที่มีบทบาทที่กำหนดไว้ล่วงหน้าในสองแบบสอบถาม sql เช่น Django ORM ทำกับ prefetch_related ฉันทำมันได้ไหม? นี่คือความพยายามของฉันในปัจจุบัน

def test_custom():
    # creating engine with echo=True
    s = DBSession()

    for t in s.query(TemplateExtra).join(RecipientRoleExtra, TemplateExtra.roles).all():
        print(f'id = {t.id}')
        for r in t.roles:
            print(f'-- {r.name}')

แต่..

  1. จะสร้างแบบสอบถามแบบเลือกสำหรับทุกเทมเพลตเพื่อเลือกบทบาท ฉันสามารถสร้าง sqlalchemy เพื่อทำแบบสอบถามเดียวได้หรือไม่?
  2. คำสั่งที่สร้างขึ้นสำหรับบทบาทจะเข้าร่วมโดยไม่เพียงแค่มีFROM recipient_role, template_to_role WHERE %(param_1)s = template_to_role.template_id AND recipient_role.id = template_to_role.role_idถูกต้องหรือไม่

คุณสามารถช่วยฉันได้ไหม?

คำตอบ

1 ky_aaaa Oct 16 2020 at 21:46

ขึ้นอยู่กับคำตอบนี้: flask many to many join as done by prefetch_related from django

อาจจะเป็นเช่นนี้:

roles = TemplateExtra.query.options(db.joinedload(TemplateExtra.roles)).all

แจ้งให้เราทราบหากได้ผล