Wie in Flask-SQLAlchemy für db.session verbundenen Abfragen paginieren?

Angenommen, wir haben die folgenden Beziehungen:

Eine Person kann viele E-Mail-Adressen habenEin E-Mail-Dienstanbieter kann (offensichtlich) mehrere E-Mail-Adressen bedienen

Es ist also eine viel zu viele Beziehung. Ich habe drei Tabellen: E-Mails, Anbieter und Benutzer. E-Mails haben zwei fremde IDs für Anbieter und Benutzer.

Nun möchte ich für eine bestimmte Person alle E-Mail-Anbieter und die darin enthaltene E-Mail-Adresse für diese Person drucken, sofern vorhanden. (Wenn die Person keine E-Mail bei Google Mail hat, möchte ich immer noch, dass Google Mail im Ergebnis enthalten ist. Ich glaube, ansonsten brauche ich nur eine linke innere Verknüpfung, um dies zu lösen.)

Ich habe mit den folgenden Unterabfragen herausgefunden, wie das geht (im Anschluss an das SQLalchemy-Tutorial):

email_subq = db.session.query(Emails).\
                filter(Emails.user_id==current_user.id).\
                subquery()

provider_and_email = db.session.query(Provider, email_subq).\
                outerjoin(email_subq, Provider.emails).\
                all()

Dies funktioniert in Ordnung (es gibt ein 4-Tupel von(Provider, user_id, provider_id, email_address), alle Informationen, die ich will), aber ich habe später herausgefunden, dass dies istnicht mit der FlascheBaseQuery Klasse, damitpagination zur Verfügung gestellt von Flask-SQLAlchemy funktioniert nicht. Offenbardb.session.query() ist nicht die Instanz von Flask-SQLAlchemy Query.

Ich habe es versuchtEmails.query.outerjoin[...] Aber das gibt nur Spalten in der E-Mail-Tabelle zurück, obwohl ich sowohl die Anbieterinformationen als auch die E-Mails haben möchte.

Meine Frage: Wie kann ich mit Flask-SQLAlchemy dasselbe tun, damit ich die bereits vorhandene Paginierung nicht erneut implementieren muss?

Ich denke, die einfachste Möglichkeit ist an dieser Stelle, meine eigene Paginat-Funktion zu implementieren, aber ich würde gerne wissen, ob es eine andere gibtrichtig Art und Weise dies zu tun.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage