я создал с помощью 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