【问题标题】:SQLAlchemy - "Optional" Foreign Key / Zero-to-One relationshipSQLAlchemy - “可选”外键/零对一关系
【发布时间】:2020-09-27 23:56:39
【问题描述】:

我正在尝试从原始 SQL 切换到 SQLAlchemy,并且正在努力为用户和团队之间的关系建模。 在这种情况下,团队有一个用户列表,而用户可以在零个或一个团队中

类似于用户表中的“可选外键”,引用 team.id 可以工作,但它必须是可空的,这不是最好的方式。

使用原始 SQL 时,我通常会创建第三个表 TeamUser(user_id, team_id),其中 user_id 作为主键

完全可以通过创建表在 SQLAlchemy 中复制这一点,但是需要编写以使用这些对象的 python 代码变得不太清楚。

例如:

将用户添加到团队:

db.session.add(TeamUser(user_id=user.id, team_id=team.id)) 
#instead of
team.users.append(user)

访问用户的团队:

user.team.team (user.team is now the couple (user_id, team_id))

获取用户列表作为用户对象:

map(lambda team_user: team_user.user, team.users)  
#instead of
team.users

所以我的问题是:有没有办法在使用 SQLAlchemy 对象的同时对这种用户/团队情况进行建模并保持简单的语法?

我查看了主连接,但它似乎没有解决这个问题。 (但也许我错了)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    如果您真的想使用连接表,请查看association_proxy

    对于一对多关系,外键更简单。玩家(用户可能是保留字)引用了一个团队:

    class Player(Base):
        __tablename__ = 'player'
        id = Column(Integer, primary_key=True)
        team_id = Column(Integer, ForeignKey('team.id'))
        team = relationship('Team')
    

    一个团队有一个球员名单:

    class Team(Base):
        __tablename__ = 'team'
        id = Column(Integer, primary_key=True)
        players = relationship('Player', back_populates='team')
    

    然后你可以通过添加播放器

    team.players.append(player) # Player() object
    

    获取一个玩家的队伍(可以是None

    team: Team = player.team
    

    获取玩家列表作为玩家对象

    team.players
    

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 2020-12-30
      • 2017-05-24
      • 1970-01-01
      • 2013-09-19
      • 2012-02-29
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      相关资源
      最近更新 更多