1

私はここで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'))

これは、テーブルの作成に使用する1つのファイルにあります。次に、別のファイルで、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 

ID360のすべてのゲームチームのリストが表示されます。しかし、代わりにこのエラーが発生します

AttributeError:'NamedTuple'オブジェクトには属性'games'がありません

ここでSQLAlchemyまたはリレーショナルデータベースについて誤解していることは何ですか?

4

2 に答える 2

1

Tableまず、として利用できるため、別のオブジェクトを作成する必要はありませんTeam.__table__。とにかく、マップされたクラスをクエリするだけです。

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

メソッド、、、およびのドキュメントを参照してください.one().first()http .all(): //docs.sqlalchemy.org/en/latest/orm/query.html

于 2013-03-06T05:36:10.777 に答える
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
于 2013-03-10T16:23:45.640 に答える