SQLAlchemy polymorphi c: установить связь между таблицами - PullRequest
0 голосов
/ 01 марта 2020

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

Только экземпляры Project связаны с Task экземплярами (однозначно много).

Мой код такой:


from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer, ForeignKey, DateTime, create_engine
from sqlalchemy.orm import relationship, sessionmaker

engine = create_engine('sqlite://')
Base = declarative_base()

session = sessionmaker(bind=engine)()

class ScheduleItem(Base):
    """"""
    __tablename__ = 'schedule_items'

    id = Column(Integer, primary_key=True)
    name = Column(String(25), nullable=False, unique=True)
    description = Column(String(255), nullable=False)
    type = Column(String(25), nullable=False)
    start_date = Column(DateTime, nullable=True)
    end_date = Column(DateTime, nullable=True)

    __mapper_args__ = {
        'polymorphic_identity': 'schedule_item',
        'polymorphic_on': type
    }

    def __repr__(self):
        return f"<{type(self).__name__}: id={self.id!r}, name={self.name!r}>"


class Project(ScheduleItem):
    """"""
    __tablename__ = 'projects'

    id = Column(Integer, ForeignKey('schedule_items.id'), primary_key=True)
    tasks = relationship('Task', backref='project', foreign_keys='Task.id')

    __mapper_args__ = {
        'polymorphic_identity': 'project',
    }


class Task(ScheduleItem):
    """"""

    __tablename__ = 'tasks'

    id = Column(Integer, ForeignKey('schedule_items.id'), primary_key=True)
    project_id = Column(Integer, ForeignKey('projects.id'), nullable=True)

    __mapper_args__ = {
        'polymorphic_identity': 'task',
    }


Base.metadata.create_all(engine)

project = Project(name='project1', description='Project 1')
project.tasks.append(Task(name='task1', description='Task 1'))
session.add(project)
session.commit()

но когда фиксируете эту ошибку ocurr:

IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: schedule_items.id
[SQL: INSERT INTO schedule_items (id, name, description, type, start_date, end_date) VALUES (?, ?, ?, ?, ?, ?)]
[parameters: (1, 'task1', 'Task 1', 'task', None, None)]
(Background on this error at: http://sqlalche.me/e/gkpj)

Любые предложения по исправлению этого?, предпочтительнее другой класс архитектура?

Заранее спасибо.

PD: вывод при активации echo:

2020-03-01 20:37:17,933 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2020-03-01 20:37:17,934 INFO sqlalchemy.engine.base.Engine INSERT INTO schedule_items (name, description, type, start_date, end_date) VALUES (?, ?, ?, ?, ?)
2020-03-01 20:37:17,935 INFO sqlalchemy.engine.base.Engine ('project1', 'Project 1', 'project', None, None)
2020-03-01 20:37:17,935 INFO sqlalchemy.engine.base.Engine INSERT INTO projects (id) VALUES (?)
2020-03-01 20:37:17,936 INFO sqlalchemy.engine.base.Engine (1,)
2020-03-01 20:37:17,936 INFO sqlalchemy.engine.base.Engine INSERT INTO schedule_items (id, name, description, type, start_date, end_date) VALUES (?, ?, ?, ?, ?, ?)
2020-03-01 20:37:17,937 INFO sqlalchemy.engine.base.Engine (1, 'task1', 'Task 1', 'task', None, None)
2020-03-01 20:37:17,937 INFO sqlalchemy.engine.base.Engine ROLLBACK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...