【问题标题】:Flask SQLAlchemy: Child table with multiple parents?Flask SQLAlchemy:具有多个父级的子表?
【发布时间】:2020-01-15 16:10:33
【问题描述】:

我是 flask_sqlalchemy 的新手,虽然我了解一对多和多对多关系的工作原理,但我很难理解如何将它们应用于我的特定数据类型。我有以下三个表:TeamStat、PlayerStat 和 Stat,大致描述如下

class PlayerStat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, nullable=False, default=datetime.datetime)
    player_id = db.Column(db.Integer, db.ForeignKey('player.player_id'), nullable=False)

class TeamStat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, nullable=False, default=datetime.datetime)
    team_id = db.Column(db.Integer, db.ForeignKey('team.team_id'), nullable=False)


class Stat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    value = db.Column(db.String(80), nullable=False)

由于 Stat 是一种通用表格类型,我希望 PlayerStat 表格(用于单个球员的统计数据)和 TeamStat 表格(作为团队中所有球员的统计数据的总和)都使用它。有人可以帮助我了解如何以这种方式将一个子表引用到多个父表吗?

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    使用关联表将您的统计表连接到您的球员和球队表。这个例子非常接近你已经在做的,除了date 列被移到统计记录表中,我已经用未映射的表替换了你的PlayerStatTeamStat 对象。

    我假设您有两个 ORM 类,PlayerTeam(抱歉,不是 Flask-SQLAlchemy,但概念保持不变):

    plr_stat_assc = Table('plr_stat_assc', Base.metadata,
        Column('player_id', Integer, ForeignKey('player.id')),
        Column('stat_id', Integer, ForeignKey('stat.id'))
    )
    
    team_stat_assc = Table('team_stat_assc', Base.metadata,
        Column('team_id', Integer, ForeignKey('team.id')),
        Column('stat_id', Integer, ForeignKey('stat.id'))
    )
    
    class Player(Base):
        __tablename__ = 'player'
        id = Column(Integer, primary_key=True)
        stats = relationship("Stat", secondary=plr_stat_assc)
    
    class Team(Base):
        __tablename__ = 'team'
        id = Column(Integer, primary_key=True)
        stats = relationship("Stat", secondary=team_stat_assc)
    
    class Stat(Base):
        __tablename__ = 'stat'
        id = Column(Integer, primary_key=True)
        date = Column(DateTime, nullable=False, default=datetime.datetime)
        value = Column(String(80), nullable=False)
    

    【讨论】:

    • 啊哈!这正是我一直在寻找的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-29
    • 2016-10-01
    相关资源
    最近更新 更多