0
Ich habe manuelle Verbindung (Query.join nicht Joinload) in sqlalchemy aus irgendeinem Grund verwendet. Ich habe Alias verwendet, da ich mehrere Join zu einer einzigen Tabelle habe. Jetzt möchte ich das Ergebnis nach einem der Beziehungsfelder sortieren. Wie kann ich Query.order_by mit Aliasnamen verwenden? Wenn ich dies tue, erhalte ich einen mehrdeutigen% (####) anstelle des Feldnamens in der Abfrage.Bestellung von einem Join-Alias in sqlalchemy
if self.order_by:
entity = self.cls
for field, order in self.order_by:
if '.' in field:
m = re.match(r'(.+)\.(.+)', field)
if m.group(1) not in self.aliases:
for item in m.group(1).split('.'):
cls = inspect(entity)
attr = cls.attrs[item]
entity = get_type(attr)
if attr.innerjoin:
aliased_entity = aliased(entity)
self.aliases[m.group(1)] = aliased_entity
_query = _query.join(aliased_entity, item).options(contains_eager(item,
alias=aliased_entity))
else:
aliased_entity = aliased(entity)
self.aliases[m.group(1)] = aliased_entity
_query = _query.outerjoin(aliased_entity, item).options(contains_eager(item,
alias=aliased_entity))
if order == "desc":
_query = _query.order_by(self.get_order_by_field(field).desc())
else:
_query = _query.order_by(self.get_order_by_field(field).asc())
Und dann:
def get_order_by_field(self, field: str) -> Column:
if '.' in field:
m = re.match(r'(.+)\.(.+)', field)
if m.group(1) in self.aliases:
return getattr(self.aliases[m.group(1)], m.group(2))
else:
return Column(self.column_map[field])
else:
return Column(field)
Ich habe hier einige Teile des Codes zu setzen. Überprüfen Sie oben. – Kamyar