Ist es ein bequemer Weg, um den alias nur widersprüchliche Spalten beim verknüpfen von Tabellen in SQLAlchemy?
-
06-07-2019 - |
Frage
Manchmal ist es nützlich, die Karte einer Klasse gegen eine join
anstatt eine einzelne Tabelle bei Verwendung von SQLAlchemy's deklarative Erweiterung.Wenn Spaltennamen kollidieren, ist in der Regel in einer eins-zu-viele, weil alle Primärschlüssel benannt sind id
standardmäßig verwenden, können Sie .alias()
Präfix jeder Spalte mit Tabellennamen.Das ist unpraktisch, wenn Sie habe bereits code geschrieben wird vorausgesetzt, dass Ihr zugeordneten Klasse ohne Präfix-Namen.
Zum Beispiel:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Table, Column, Integer, ForeignKeyConstraint
Base = declarative_base()
t1 = Table('t1',
Base.metadata,
Column('id', Integer, primary_key=True))
t2 = Table('t2',
Base.metadata,
Column('id', Integer, primary_key=True),
Column('fkey', Integer),
ForeignKeyConstraint(['fkey'], [t1.c.id]))
class ST(Base):
__table__ = t1.join(t2)
class ST2(Base):
__table__ = t1.join(t2).alias()
ST
hat id
, fkey
Eigenschaften mit jedem Namen die Zuordnung zu der ersten Tabelle im join verwendet, die überschriebenen Namen, so dass die zugeordnete Klasse nicht aussetzen t2
's primary key. ST2
hat t1_id
, t2_id
und t2_fkey
Eigenschaften.
Ist es ein bequemer Weg, um den alias nur einige der Spalten aus jeder Tabelle in den join
so ist die zugeordnete Klasse macht die mehr bequem, nicht-Präfix-Eigenschaft Namen für die meisten zugeordnete Spalten?
Lösung
Sie können erstellen Sie alias für jede Spalte einzeln mit seinen label()
Methode.So ist es möglich, etwas ähnliches wie die folgende (nicht getestet):
from sqlalchemy import select
def alias_dups(join):
dups = set(col.key for col in join.left.columns) & \
set(col.key for col in join.right.columns)
columns = []
for col in join.columns:
if col.key in dups:
col = col.label('%s_%s' % (col.table.name, col.key))
columns.append(col)
return select(columns, from_obj=[join]).alias()
class ST2(Base):
__table__ = alias_dups(t1.join(t2))