Ist es ein bequemer Weg, um den alias nur widersprüchliche Spalten beim verknüpfen von Tabellen in SQLAlchemy?

StackOverflow https://stackoverflow.com/questions/1627429

  •  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?

War es hilfreich?

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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top