SQLAlchemy 使用 relationship()

1 投票
2 回答
2345 浏览
提问于 2025-04-17 18:05

我在这里使用SQLAlchemy,想要创建几个表并把它们连接起来,但在实现这个过程中遇到了一些问题。

class Team(Base):

    __tablename__ = "teams"

    id = Column(Integer, primary_key=True)
    espn_team_id = Column(Integer, unique=True, nullable=False)
    games = relationship("Game", order_by="Game.date")

    def __init__(self, name):
        self.name = name
        self.espn_team_id = espn_team_id
        self.games = games

class Game(Base):
    __tablename__ = "games"

    id = Column(Integer, primary_key=True)
    espn_game_id=Column(Integer, unique=True, nullable=False)
    date = Column(Date)

    h_espn_id = Column(Integer, ForeignKey('teams.espn_team_id'))
    a_espn_id = Column(Integer, ForeignKey('teams.espn_team_id'))

我在一个文件里创建这些表。然后在另一个文件里,我用insert()函数往这两个表里插入数据。我想,如果我有一个团队,espn_team_id是360,然后我在游戏表里插入多个比赛,这些比赛的h_espn_id或者a_espn_id都是360,我应该可以这样做:

a = Table("teams", metadata, autoload=True)
a = session.query(a).filter(a.c.espn_team_id==360).first().games 

这样就能给我列出所有ID为360的团队参加过的比赛。但结果我却遇到了这个错误:

AttributeError: 'NamedTuple'对象没有'games'这个属性

我在SQLAlchemy或者关系数据库方面到底理解错了什么呢?

2 个回答

1

首先,你不需要再创建一个新的 Table 对象,因为它可以通过 Team.__table__ 直接使用。其实,你只需要查询映射的类,比如:

query = Session.query(Team).filter(Team.espn_team_id == 360)
team360 = query.one()
games = team360.games

关于 .one().first().all() 这些方法的详细信息,可以参考文档:http://docs.sqlalchemy.org/en/latest/orm/query.html

0

这是我找到的解决方案,花了我太长时间才明白这个...

class Team(Base):

    __tablename__ = "teams"

    id = Column(Integer, primary_key=True)
    name = Column(String)
    espn_team_id = Column(Integer, unique=True, nullable=False)

    h_games = relationship(
                  "Game", 
                  primaryjoin="Game.h_espn_id==Team.espn_team_id", 
                  order_by="Game.date")
    a_games = relationship(
                  "Game", 
                  primaryjoin="Game.a_espn_id==Team.espn_team_id", 
                  order_by="Game.date")

    @hybrid_property
    def games(self):
        return self.h_games+self.a_games

    def __init__(self, name):
        self.name = name
        self.espn_team_id = espn_team_id
        self.h_games = h_games
        self.a_games = a_games
        self.games = games

撰写回答