在SQLAlchemy中将数据插入到多个关系中

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

假设我在SQLALchemy中有3个类:Topic,,,Tag,,,Tag_To_Topic...

是否有可能写一些类似于:

new_topic = Topic("new topic")
Topics.tags = ['tag1', 'tag2', 'tag3']

在标签表中自动插入“tag1”、“tag2”和“tag3”,并在new_topic这三个标签Tag_To_Topic

到目前为止,我还没有弄清楚如何做到这一点,因为很多很多的关系。(如果它是一对多的,这将是非常容易的,SQLAlchemy默认情况下已经这样做了。但这是多对多的。)

这个是可能的吗?

好好看解密好好看解密提问于
手滑点了滑稽回答于

首先,可以通过使用。

然后,为了不干涉SA所做的事情,我将保留这种关系:

# here *tag_to_topic* is the relation Table object
Topic.tags = relation('Tag', secondary=tag_to_topic)

我建议只创建一个简单的包装器属性,它完成将字符串列表转换为关系对象的工作(您可能会重命名关系)。标记类看起来类似于:

class Topic(Base):
    __tablename__ = 'topic'
    id = Column(Integer, primary_key=True)
    # ... other properties

    def _find_or_create_tag(self, tag):
        q = Tag.query.filter_by(name=tag)
        t = q.first()
        if not(t):
            t = Tag(tag)
        return t

    def _get_tags(self):
        return [x.name for x in self.tags]

    def _set_tags(self, value):
        # clear the list first
        while self.tags:
            del self.tags[0]
        # add new tags
        for tag in value:
            self.tags.append(self._find_or_create_tag(tag))

    str_tags = property(_get_tags,
                        _set_tags,
                        "Property str_tags is a simple wrapper for tags relation")

那么这段代码应该可以工作:

# Test
o = Topic()
session.add(o)
session.commit()
o.str_tags = ['tag1']
o.str_tags = ['tag1', 'tag4']
session.commit()

扫码关注云+社区