【问题标题】:Many-to-Many relation in sqlalchemy doesnt load while it adds and deletes itemssqlalchemy 中的多对多关系在添加和删除项目时不会加载
【发布时间】:2018-05-23 04:21:15
【问题描述】:

我在 SQLAlchemy 中创建了一个多对多自引用关系,如下所示:

blacklist_association_table = Table('userblacklist', Base.metadata,
    Column('user_id', Integer, ForeignKey('user.id'), primary_key=True),
    Column('blacklisted_id', Integer, ForeignKey('user.id'), primary_key=True)
)


class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=True)

    blacklist = relationship("User",
                             secondary=blacklist_association_table,
                             primaryjoin=(id == blacklist_association_table.c.user_id),
                             secondaryjoin=(blacklist_association_table.c.blacklisted_id == id))

当我使用 append 将项目添加到 blacklist 字段时,它可以工作并且新数据会提交到 DB

但是当我需要访问列表时,blacklist 字段为空!! 即

u = session.query(User).filter(User.id == userid).one_or_none()
print len(u.blacklist)

输出为0,而数据库中存在数据!

有什么问题?

【问题讨论】:

    标签: python mysql sqlalchemy many-to-many self-join


    【解决方案1】:

    你的意思是放

    print len(u.blacklist)
    

    否则我认为您需要更多上下文。

    编辑

    你能试试吗:

    u = session.query(User).filter(User.id == userid).one_or_none()
    print len(u.blacklist)
    u.blacklist.append(session.query(User).first())
    session.commit()
    print len(u.blacklist)
    u = session.query(User).filter(User.id == userid).one_or_none()
    print len(u.blacklist)
    

    据我所知,您的代码在上面是正确的。 你是说你会从上面得到以下输出:

    0
    1
    0
    

    ?

    【讨论】:

    • 是的,实际上我有另一个这样的字段,这个错字就是因为这个;我编辑了这个问题;当数据库中存在数据时,这两个字段都为空
    • 是的,没错!这就是问题
    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2015-02-21
    • 2012-02-08
    • 2017-12-08
    • 2016-03-20
    相关资源
    最近更新 更多