我有两个实体,Player
和 Game
,它们之间的关系是多对多的。
Player
以及Player
和Game
之间的连接(PlayerGame
)都有得分
class Player(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
score = db.Column(db.Float)
name = db.Column(db.String(45), nullable=False)
class Game(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(45))
class PlayerGame(db.Model):
player_id = db.Column(db.Integer, db.ForeignKey('players.id'), primary_key=True)
game_id = db.Column(db.Integer, db.ForeignKey('games.id'), primary_key=True)
score = db.Column(db.Float)
player = db.relationship("Player", backref="games")
game = db.relationship("Game", backref="players")
我想使用给定游戏 ID 的 sqlalchemy 编写查询,返回所有相关玩家,但他们的分数将被游戏分数覆盖
到目前为止,我的查询看起来像这样
Player.query.join(PlayerGame, and_(
PlayerGame.player_id == Player.id,
PlayerGame.game_id == game_id))\
.options(contains_eager(Player.games))
我正在考虑更改 Player.score
和 PlayerGame.score
标签名称,或者排除 Player.score
但以上都不是真的似乎有效
可以在 python 代码查询之后执行此操作,但理想情况下,我希望它成为查询的一部分
最佳答案
我稍微调整了你的模型,然后在下面使用了一个不返回“Player”对象的查询,因为结果是来自玩家的属性和来自 PlayerGame 的属性:
class Player(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
score = db.Column(db.Float)
name = db.Column(db.String(45), nullable=False)
playergames = db.relationship('PlayerGame', backref='player', lazy=True,
cascade="delete")
class Game(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(45))
playergames = db.relationship('PlayerGame', backref='game', lazy=True,
cascade="delete")
class PlayerGame(db.Model):
player_id = db.Column(db.Integer, db.ForeignKey('player.id'), primary_key=True)
game_id = db.Column(db.Integer, db.ForeignKey('game.id'), primary_key=True)
score = db.Column(db.Float)
p = Player(name = "Hoffmann", score = 7.5)
p1 = Player(name = "Fink", score = 4.5)
db.session.add(p)
db.session.add(p1)
g = Game(name = "VfB")
g1 = Game(name = "HSV")
db.session.add(g)
db.session.add(g1)
pg = PlayerGame(player = p, game = g, score = 1.5)
pg1 = PlayerGame(player = p1, game = g, score = 3.5)
db.session.add(pg)
db.session.add(pg1)
db.session.commit()
playergamescores = db.session.query(Player.name,
PlayerGame.score).join(Player).filter(PlayerGame.game_id == g.id).all()
print(playergamescores)
然后输出是 [('Hoffmann', 1.5), ('Fink', 3.5)]
关于python - Sqlalchemy 覆盖关联表中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58471414/