Я немного застрял в 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)