我正在尝试通过减少对数据库的调用来优化代码。我有以下型号:
class PageCategory(Base):
category_id = Column(Text, ForeignKey('category.category_id'), primary_key=True)
page_id = Column(Text, ForeignKey('page.page_id'), primary_key=True)
class Category(Base):
category_id = Column(Text, primary_key=True)
name = Column(Text, nullable=False)
pages = relationship('Page', secondary='page_category')
class Page(Base):
page_id = Column(Text, primary_key=True)
name = Column(Text, nullable=False)
categories = relationship('Category', secondary='page_category')
该代码收到了一系列Facebook赞,并且每个赞都有一个Page
a Category
和它们之间的明显联系为PageCategory
。我需要找到一种方法来批量创建(如果还不存在的话)不同的页面,类别以及它们之间的关系。鉴于代码需要快速,因此在创建每个对象时我无法往返于数据库。
page = Page(page_id='1', name='1')
category = Category(category_id='2', name='2')
session.add(page)
session.add(category)
session.commit()
...same for PageCategory
现在,假设page_id
和category_id
是PK,如果我们尝试插入重复项,则数据库将产生一个IntegrityError
,但这仍然是往返行程。我需要一个实用程序来接收诸如session.bulk_save_objects([page1, page2, category1, category2, page_category1, page_category2])
之类的对象列表,但只创建不会引发IntegrityError的对象,而忽略那些会引发IntegrityError的对象。
这样,我将避免为每个三重对象避免数据库IO。我不知道这是否可行或超出SQLAlchemy的功能。