PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Jointure avec la fonction de retour d'ensemble (SRF) et les colonnes d'accès dans SQLAlchemy

Il s'avère que cela n'est pas directement pris en charge par SA, mais le comportement correct peut être obtenu avec un ColumnClause et un FunctionElement . Importez d'abord cette recette comme décrit par zzzeek dans ce problème SA . Créez ensuite un unnest spécial fonction qui inclut le WITH ORDINALITY modificateur :

class unnest_func(ColumnFunction):
    name = 'unnest'
    column_names = ['unnest', 'ordinality']

@compiles(unnest_func)
def _compile_unnest_func(element, compiler, **kw):
    return compiler.visit_function(element, **kw) + " WITH ORDINALITY"

Vous pouvez ensuite l'utiliser dans les jointures, les commandes, etc. comme ceci :

act_ref = unnest_func(Activity.ob_refs)
query = (query
    .add_columns(act_ref.c.unnest, act_ref.c.ordinality)
    .outerjoin(act_ref, sa.true())
    .outerjoin(Subscription, Subscription.ob_ref == act_ref.c.unnest)
    .order_by(act_ref.c.ordinality.desc()))