هل هناك وسيلة مريحة لاسم مستعار متضاربة الأعمدة فقط عندما ربط الجداول في SQLAlchemy؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأحيانا يكون من المفيد تعيين فئة ضد join بدلا من جدول واحد عند استخدام SQLAlchemy " ق تمديد التعريفي. عندما تصطدم أسماء الأعمدة، وعادة في id واحد لكثير لأن كل المفاتيح الأساسية يتم تسمية افتراضيا، يمكنك استخدام .alias() بادئة كل عمود مع اسم الجدول الخاص به. هذا غير مريح إذا كنت قد التعليمات البرمجية التي يفترض صفك معين لها أسماء غير مسبوقة كتبت بالفعل.

وعلى سبيل المثال:

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 ديه id، خصائص fkey مع كل تعيين اسم إلى الجدول الأول في الانضمام يستخدم اسم متجاوزة، وبالتالي فإن الطبقة المعينة لا يعرض المفتاح الأساسي t2 ل. ST2 ديه t1_id، t2_id وt2_fkey خصائص.

هل هناك وسيلة مريحة لاسم مستعار فقط بعض الأعمدة من كل جدول في join حتى تكشف الطبقة تعيين أسماء الخصائص غير مسبوقة أكثر ملاءمة للأعمدة الأكثر معين؟

هل كانت مفيدة؟

المحلول

يمكنك إنشاء اسم مستعار لكل عمود على حدة مع طريقة label() لها. لذلك من الممكن شيء مشابه لما يلي (لم تختبر):

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))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top