2013-03-06 123 views
1

我在这里使用SQLAlchemy,试图制作一对表并将它们链接起来,并且在实现时遇到问题。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 = 360,或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”对象有没有属性“游戏”

什么我误解关于SQLAlchemy的或关系型数据库在这里?

回答

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 
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

sayap感谢为您的文章和你的第一点。第二点是我的错,现在我会编辑它,我包含.first(),它不起作用。关注: 打印session.query(一).filter(acespn_team_id == 360)。首先()游戏 回溯(最近通话最后一个): 文件 “”,1号线,在 AttributeError:'NamedTuple'对象没有'游戏'属性 – appleLover 2013-03-06 21:37:45

+0

,我尝试按照你的方式做: from table_def import team,game >>> print session.query(Team).filter(Team.espn_team_id == 360) .first()游戏 [大错误信息] sqlalchemy.exc.InvalidRequestError:一个或多个映射器未能初始化 - 无法继续初始化其他映射器。原始异常是:无法确定关系Team.games上的父/子表之间的连接条件。指定一个'primaryjoin'表达式。如果存在“次要”,则还需要“次要连接”。 – appleLover 2013-03-06 21:41:33

+0

哦,你的类映射是不完整的,因为你在表之间有两个外键。我认为你需要有'Team.home_games'和'Team.away_games'。 – sayap 2013-03-06 21:46:33