【问题标题】:sqlalchemy foreign key relationship attributessqlalchemy 外键关系属性
【发布时间】:2013-09-19 09:09:10
【问题描述】:

我有一个用户表和一个朋友表。 Friend 表包含我的 User 表和状态字段的两个外键。我试图能够从我的用户表中调用 Friend 对象的属性。例如,我希望能够做类似friend.name 或friend.email 之类的操作。

class User(Base):
    """ Holds user info """

    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(25), unique=True)
    email = Column(String(50), unique=True)
    password = Column(String(25))
    admin = Column(Boolean)

    # relationships
    friends = relationship('Friend', backref='Friend.friend_id',primaryjoin='User.id==Friend.user_id', lazy='dynamic')

class Friend(Base):
    __tablename__ = 'friend'

    user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    request_status = Column(Boolean)

当我得到 friend 对象时,我只有 2 个 user_ids 并且我想显示每个用户的所有属性,以便我可以在表单等中使用该信息。我是 sqlalchemy 的新手 - 仍在努力学习更高级的功能。这只是来自一个更大的 Flask 项目的一个 sn-p,这个功能将用于 friend 请求等。我试图查找关联对象等,但我遇到了困难。

任何帮助将不胜感激。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    首先,如果你使用flask-sqlalchemy,为什么你直接使用sqlalchemy而不是Flask的db.Model

    我强烈建议使用 flask-sqlalchemy 扩展,因为它利用了会话和其他一些简洁的东西。

    创建代理便利对象很简单。只需在Friend 类中添加与它的关系即可。

    class Friend(Base):
        __tablename__ = 'friend'
    
        user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
        friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
        request_status = Column(Boolean)
    
        user = relationship('User', foreign_keys='Friend.user_id')
        friend = relationship('User', foreign_keys='Friend.friend_id')
    

    SQLAlchemy 会处理剩下的事情,您可以通过以下方式访问用户对象:

    name = friend.user.name
    

    如果您计划每次使用friend 对象时都使用user 对象,请在relationship 中指定lazy='joined'。这样,它会在一个查询中加载这两个对象。

    【讨论】:

    • 感谢您的回复。我得到: sqlalchemy.exc.AmbiguousForeignKeysError: 无法确定关系 Friend.user 上的父/子表之间的连接条件 - 有多个外键路径链接表。指定“foreign_keys”参数,提供那些列的列表,这些列应该被视为包含对父表的外键引用。这是我面临的问题,因为 Friend 对象对 User.id 都有 2 个外键。有什么想法吗?
    • @Ptrkcon 哦,对不起,我没明白这一点。我修正了我的答案,添加了foreign_keys 参数。我在这里尝试过,它有效:)
    • 完美!我想了很多。它总是最简单的答案!我是这个东西的新手,没有意识到你可以让 foreign_keys 引用它所在的表。谢谢
    • 这很令人困惑:你为什么需要朋友的关系? User 上的朋友的 backref 不应该照顾它吗?感觉像重复
    • @Tjorriemorrie 是的,正如我在答案中所说,您只需要 Friend 关系。 OP询问如何访问链接的两个用户。您应该在Friend 关系上放置backref 以增强User 提供friends。希望这个答案。 :)
    猜你喜欢
    • 2017-05-24
    • 2012-02-29
    • 2018-03-03
    • 2011-02-25
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多