SQLAlchemy多表关联查询报错:Not unique table/alias: 'team' 求助
解决SQLAlchemy多表关联重复表别名问题
错误原因
你遇到的sqlalchemy.exc.OperationalError: (MySQLdb.OperationalError) (1066, "Not unique table/alias: 'team'")报错,是因为连续两次关联Team表时未指定别名,数据库无法区分两次关联的表实例,导致识别冲突。
修正后的代码
from sqlalchemy import desc, aliased limit = 200 with app.app_context(): # 给两次关联的Team表分别指定别名 home_team = aliased(Team) away_team = aliased(Team) # 给对应的TennisPlayer表也指定别名 home_player = aliased(TennisPlayer) away_player = aliased(TennisPlayer) games = db.session.query(Game)\ .filter(Game.time_started != None, Game.scores_home != None, Game.scores_away != None)\ # 关联主队Team表 .join(home_team, Game.team_home_id == home_team.id)\ # 关联客队Team表 .join(away_team, Game.team_away_id == away_team.id)\ # 过滤主队的tennisplayer_id非空 .filter(home_team.tennisplayer_id != None)\ # 关联主队对应的TennisPlayer .join(home_player, home_team.tennisplayer_id == home_player.id)\ # 过滤主队选手出生日期非空 .filter(home_player.dayOfBirth != None)\ # 过滤客队的tennisplayer_id非空 .filter(away_team.tennisplayer_id != None)\ # 关联客队对应的TennisPlayer .join(away_player, away_team.tennisplayer_id == away_player.id)\ # 过滤客队选手出生日期非空 .filter(away_player.dayOfBirth != None)\ .order_by(desc(Game.time_started))\ .limit(limit)\ .all()
关键修正点
- 使用
aliased()给重复关联的Team和TennisPlayer表指定不同别名,明确区分主队、客队及其对应的选手 - 分别对主队、客队的
tennisplayer_id做非空校验,确保两队都是网球选手 - 分别对两位选手的
dayOfBirth做非空校验,符合你要求的筛选条件
内容的提问来源于stack exchange,提问作者velkyvont
相关产品推荐
相关产品推荐

