Python 子表中多个值的空用户id
我在炼金术方面有问题。我有一对多的关系:Python 子表中多个值的空用户id,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我在炼金术方面有问题。我有一对多的关系: class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(255)) tags = relationship('Tag', back_populates='users') class Tag(Base): __tablename__ = 'tags' id
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255))
tags = relationship('Tag', back_populates='users')
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True)
tag_name = Column(String(50))
user_id = Column(Integer, ForeignKey('users.id'))
users = relationship('User', back_populates='tags')
当我以这种方式保存标记时
user = session.query(User).filter(User.id == user_id).first()
user.tags = [Tag(tag_name=tag_name)]
session.add(user)
session.commit()
所有标签都保存了,但当o打开我的数据库时,我看到只有最后一个标签的用户id值为,而其他标签的此字段为空。
但测试必须具有用户_id=1。
我如何解决这个问题?
对于框架,我使用sanic,db是posgresql。
我想为id=1的用户保存许多标记,如:[user_id=1,tag='tad1'],[user_id=1,tag='tad2']和[user_id=1,tag='tad3']。因此,我可能有多个用户,但每个用户都有自己的多个标记。很难判断,因为您没有显示添加多个标记的完整上下文,但如果您使用的是以下内容:
def add_tag(user_id,tag_name):
user = session.query(User).filter(User.id == user_id).first()
user.tags = [Tag(tag_name=tag_name)]
session.add(user)
session.commit()
for tag in tags:
add_tag(user_id=user.id,tag_name=tag.name)
然后像这样执行它:
def add_tag(user_id,tag_name):
user = session.query(User).filter(User.id == user_id).first()
user.tags = [Tag(tag_name=tag_name)]
session.add(user)
session.commit()
for tag in tags:
add_tag(user_id=user.id,tag_name=tag.name)
然后,因为您使用user.tags=[Tag(Tag\u name=Tag\u name)],所以您将覆盖所有以前的标记,而不是附加到它们。这将解释为什么只有最后一个标记似乎连接到用户。要附加新标记而不是覆盖,应使用append()如下所示:
目前的问题还不够清楚,因为提供的数据只有一个用户和一个标记,而问题是在多个用户和多个标记的上下文中提出的。包含附加代码以插入所需数据以演示您希望解决的实际问题会很有用。我通过描述我的目标来编辑我的问题。是的,这就是您的目标,但是您没有演示您的代码如何无法实现这一目标,因为我无法用您提供的代码复制您的问题。我所看到的是,如果我使用
user.tags=[Tag(Tag_name='tag0')、Tag(Tag_name='tag1')、Tag(Tag_name='tag2')]
,然后选择所有标记,并打印([(Tag in tags.user_id,Tag.Tag name)])
,我看到[(1,'tag0'),(1,'tag1'),(1,'tag2')]
作为输出。您是否使用user.tags=[Tag(Tag\u name=Tag\u name)]一次保存一个标记?如果是这样,您可能会覆盖所有以前的标记。您是否考虑过使用user.tags.append(Tag(Tag\u name=Tag\u name))来追加额外的标记,而不是覆盖以前的标记?