Относящиеся к самому себе отношения «многие ко многим» с прокси-сервером ассоциации в SQLAlchemy - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь создать Само-ссылочные отношения «многие ко многим».Пример, описанный в документации SQLAlchemy , прекрасно работает.Вот модели, которые я создал:

from sqlalchemy import Integer, ForeignKey, String, Column, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

Table('NodeToNode', Base.metadata,
    Column('leftNodeId', Integer, ForeignKey('Node.id'), primary_key=True),
    Column('rightNodeId', Integer, ForeignKey('Node.id'), primary_key=True)
)

class Node(Base):
    __tablename__ = 'Node'
    id = Column(Integer, primary_key=True)
    label = Column(String)

    rightNodes = relationship('Node',
        secondary='NodeToNode',
        primaryjoin='Node.id==NodeToNode.c.leftNodeId',
        secondaryjoin='Node.id==NodeToNode.c.rightNodeId',
        backref='leftNodes'
    )

И скрипт для добавления данных в:

from sqlalchemy import create_engine
from sqlalchemy.orm import Session

engine = create_engine('sqlite:///practice.sqlite3')
session = Session(bind=engine)

nodes = [
    Node(label='A'),
    Node(label='B'),
    Node(label='C'),
    Node(label='D'),
    Node(label='E'),
]

nodes[0].rightNodes = [nodes[1], nodes[3], nodes[2]]
nodes[0].leftNodes = [nodes[4]]

session.add_all(nodes)
session.commit()

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

class NodeToNode(Base):
    __tablename__ = 'NodeToNode'
    leftNodeId = Column(Integer, ForeignKey('Node.id', onupdate='CASCADE'), primary_key=True)
    rightNodeId = Column(Integer, ForeignKey('Node.id', onupdate='CASCADE'), primary_key=True)
    sortOrder = Column(Integer, nullable=False)

Это, однако, приводит к следующей ошибке:

sqlalchemy.exc.InvalidRequestError: Class <class 'models.node.NodeToNode'> does not have a mapped column named 'c'

Есть идеи, что я здесь не так делаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...