Малко съм заседнал с sqlalchemy, опитвайки се да актуализирам някои данни.
Имам връзка много към много и едно към много. Първият е връзката между автор и възможните изписвания на името му. Второто свързва авторите с тяхната писмена литература. Един доклад може да има няколко автора и обратно.
Ако приемем автор „Питър Шоу“, който вече има 4 статии, съхранени и свързани с него в базата данни. Не, искам да „добавя“ нов набор от 6 листа за „Питър Шоу“. За съжаление 4 от 6-те документа вече се съхраняват в базата данни. Ето защо session.commit()
води до дублирана грешка.
Има ли общ начин да се избегнат дублиращите се грешки и да се каже на sqlalchemy просто да запълни дупките, вместо да се оплаква от дубликатите? Нито документът на sqlalchemy, нито google можеха да ме просветят с ясен отговор/подход, така че всички предложения са добре оценени.
Това са моделите, с които тествам:
class NameSpelling(Base):
__tablename__ = 'name_spellings'
id = Column(Integer, primary_key=True)
name = Column(String(255), nullable=False, unique=True, index=True)
authors_id = Column(Integer, ForeignKey('authors.id'))
def __init__(self, name=None):
self.name = name
def __repr__(self):
return "NameSpelling(%r)" % (self.name)
class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String(255), nullable=True, unique=True, index=True)
papers = relationship('Paper',
secondary=author_paper,
backref='authors')
name_spellings = relationship(NameSpelling,
order_by=NameSpelling.id,
backref="author",
cascade="all, delete, delete-orphan")
def __init__(self, name=None):
self.name = name
def __repr__(self):
return "Authors(%r, %r)" % (self.name_spellings, self.name)
class Paper(Base):
__tablename__ = 'papers'
id = Column(Integer, primary_key=True)
title = Column(String(1500), nullable=False, index=True)
url = Column(String(255), nullable=False, unique=True, index=True)
date = Column(Date(), nullable=True)
def __init__(self, title=None, url=None, date=None):
self.title = title
self.url = url
self.date = date
def __repr__(self):
return "Paper(%r)" % (self.title)