gpt4 book ai didi

sqlalchemy - 在SQLAlchemy中以多对多关系插入数据

转载 作者:行者123 更新时间:2023-12-01 23:13:29 24 4
gpt4 key购买 nike

假设我在SQLALchemy中有3个类:TopicTagTag_To_Topic

是否可以编写类似以下内容的内容:

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

我想在Tag表中自动插入“tag1”,“tag2”和“tag3”,并在 new_topicTag_To_Topic表中的这3个标签之间插入正确的关系。

到目前为止,由于多对多关系,我还无法弄清楚该如何做。 (如果是一对多的话,这将非常容易,SQLAlchemy会默认使用它。但这是多对多的。)

这可能吗?

谢谢,博达·西多(Boda Cydo)。

最佳答案

通过使用association_proxy,所有拳头都可以简化多对多关系。

然后,我将按原样保留该关系,以便不干扰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()

关于sqlalchemy - 在SQLAlchemy中以多对多关系插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com