هل هناك وسيلة مريحة لاسم مستعار متضاربة الأعمدة فقط عندما ربط الجداول في SQLAlchemy؟
-
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))