SQLAlchemy批量创建(如果不存在)

时间:2018-07-17 02:35:50

标签: python sqlalchemy bulk

我正在尝试通过减少对数据库的调用来优化代码。我有以下型号:

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_idcategory_id是PK,如果我们尝试插入重复项,则数据库将产生一个IntegrityError,但这仍然是往返行程。我需要一个实用程序来接收诸如session.bulk_save_objects([page1, page2, category1, category2, page_category1, page_category2])之类的对象列表,但只创建不会引发IntegrityError的对象,而忽略那些会引发IntegrityError的对象。

这样,我将避免为每个三重对象避免数据库IO。我不知道这是否可行或超出SQLAlchemy的功能。

0 个答案:

没有答案