表中的create_or_get条目

时间:2013-11-27 17:53:38

标签: python sqlalchemy

我有两个相关的课程如下:

class IP(Base):
    __tablename__ = 'ip'
    id = Column(Integer, primary_key=True)
    value = Column(String, unique=True)
    topics = relationship('Topic')


class Topic(Base):
    __tablename__ = 'topic'
    id = Column(Integer, primary_key=True)
    value = Column(String)
    ip_id = Column(Integer, ForeignKey('ip.id'))
    ip = relationship('IP')

if __name__ == '__main__':
  Base.metadata.create_all(engine)
  topics = [
      Topic(value='t1', ip=IP(value='239.255.48.1')),
      Topic(value='t2', ip=IP(value='239.255.48.1')),
      Topic(value='t3', ip=IP(value='239.255.48.1'))
      ]
  session.add_all(topics)

上述方法无效,因为它尝试添加具有相同值的不同ip条目。是否可以创建或获取现有的,以便我可以像下面一样使用?

  topics = [
      Topic(value='t1', ip=create_or_get(value='239.255.48.1')),
      Topic(value='t2', ip=create_or_get(value='239.255.48.1')),
      Topic(value='t3', ip=create_or_get(value='239.255.48.1'))
      ]

1 个答案:

答案 0 :(得分:1)

当然,只需创建功能:

def create_or_get(value):
    obj = session.query(IP).filter(IP.value==value).first()
    if not obj:
        obj = IP(value=value)
        session.add(obj)
    return obj

当然,它需要一个session,但如果您使用scoped_session工厂,则很简单。或者,您可能会查看事件,但要解决问题太复杂了。

相关问题