Dire, abbiamo le seguenti relazioni:Come impaginare in Flask-SQLAlchemy per le query unite da db.session?
- una persona può avere molti indirizzi email
- un fornitore di servizi di posta elettronica può (ovviamente) servirà multipla indirizzo e-mail
così, è una relazione molti a molte relazioni Ho tre tabelle: email, provider e utenti. Le email hanno due ID stranieri per provider e utente.
Ora, data una persona specifica, voglio stampare tutti i provider di posta elettronica e l'indirizzo di posta elettronica che ospita per questa persona, se esiste. (Se la persona non ha un'e-mail in Gmail, voglio comunque che Gmail sia nel risultato. Credo che in questo caso sia necessario un join interno sinistro per risolvere questo problema.)
Ho capito come fare questo con il seguente sottoquery (di seguito il tutorial sqlalchemy):
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()
questo funziona bene (restituisce un 4 parametri di (Provider, user_id, provider_id, email_address)
, tutte le informazioni che voglio), ma in seguito ho scoperto che questo è non utilizzando il Flask BaseQuery
classe, in modo che pagination
fornito da Flask-SQLAlchemy non funzioni. Apparentemente db.session.query()
non è l'istanza di Query Flask-SQLAlchemy.
Ho provato a fare Emails.query.outerjoin[...]
ma che restituisce solo colonne nella tabella e-mail anche se voglio entrambe le informazioni del provider e le e-mail.
La mia domanda: come posso fare la stessa cosa con Flask-SQLAlchemy in modo che non debba ri-implementare la paginazione che è già lì?
Credo che l'opzione più semplice a questo punto è quello di implementare la mia propria funzione paginate, ma mi piacerebbe sapere se c'è un altro corretta modo di fare questo.
ho fatto sostituire il 'tutto()' 'con paginate()' e args è propria, così mi chiamo 'paginate' su un sqlalchemy.orm.query.Query object (verificato nel debugger della pagina di errori Flask). Immagino che questa non sia la fonte di errore qui. Ci scusiamo per non essere chiari nella domanda. –
Dang, avevo sperato che fosse qualcosa di facile. Cosa succede se si utilizza l'alias della query Flask-SQLAlchemy? Qualcosa di simile: Email.query.filter (Emails.user_id == current_user.id) .outerjoin (ProviderEmail, ProviderEmail.provider_id == Email.id) –
Produce una query SELECT con solo i campi in 'Email' inclusi, quindi nulla sul provider viene restituito; almeno è l'ultima volta che ci ho provato. –