Данные ассоциации SQLAlchemy через конструктор связанного класса - PullRequest
0 голосов
/ 04 мая 2018

У меня есть этот дизайн

# coding: utf-8
from sqlalchemy import Column, VARCHAR, ForeignKey, create_engine
from sqlalchemy.dialects.mysql import INTEGER, TINYINT
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.inspection import inspect
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy


engine = create_engine('mysql://root:toor@localhost/test', echo=True)
Model = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()


class A(Model):
    __tablename__ = 'A'

    id = Column(INTEGER(unsigned=True), primary_key=True)
    name = Column(VARCHAR(32), nullable=False, index=True)


class AB(Model):
    __tablename__ = 'AB'

    A_id = Column(INTEGER(10, unsigned=True), ForeignKey('A.id'), nullable=False, primary_key=True)
    B_id = Column(INTEGER(10, unsigned=True), ForeignKey('B.id'), nullable=False, primary_key=True)
    type = Column(TINYINT(3, unsigned=True), nullable=False)
    A_rel = relationship(
    "A",
    foreign_keys=[A_id]
    )
    B_rel = relationship(
    "B",
    foreign_keys=[B_id],
    )


mapper_AB = inspect(AB)


class B(Model):
    __tablename__ = 'B'

    id = Column(INTEGER(10, unsigned=True), primary_key=True)

    As = relationship("A", secondary=mapper_AB.local_table, uselist=False)
    ABs = relationship("AB")
    type = association_proxy('ABs', 'type')


Model.metadata.create_all(engine)

a = A(
    name="test",
)

session.add(a)
session.commit()

b = B(
    As=a,
    type=2
)
print(b.type)

session.add(b)
session.commit()

Это, очевидно, не удается, но я пытаюсь упростить дизайн, добавив дополнительную информацию (тип) AB через один (B) конструктор связанных классов.

Я просмотрел тонны документации по SQLAlchemy и даже потерял себя внутри исходного кода, но безрезультатно. Конструкция базы данных с тремя таблицами не может быть изменена, так как является частью более крупной системы и относится к другому проекту. Моя цель состоит в том, чтобы отобразить эти таблицы в более упрощенный дизайн для дальнейшего развития, где будут использоваться эти модели.

Возможно ли это с помощью механизмов SQLAlchemy с декларативным стилем?

...