PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Joining mit Set-Returning-Funktion (SRF) und Zugriffsspalten in SQLAlchemy

Es stellt sich heraus, dass dies nicht direkt von SA unterstützt wird, aber das korrekte Verhalten kann mit einem ColumnClause und ein FunctionElement . Importieren Sie zuerst dieses Rezept wie von zzzeek beschrieben in dieses SA-Problem . Erstellen Sie dann ein spezielles unnest Funktion, die WITH ORDINALITY enthält Modifikator:

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"

Sie können es dann in Joins, Sortierungen usw. wie folgt verwenden:

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()))