many-to-many связь. Хочу, чтобы в Player лежали все его команды. Код ниже почти привёл к результату, но он выдаёт несколько игроков с одинаковым id и разными командами.
Можно как–то средствами Алхимии собрать команды одного игрока в массив, чтобы строки с одинаковым id игрока не множились?
query = select(
Player.id,
Team
) \
.join(Player.teams) \
.where(Player.id == player_id)
зачем тебе инживидуальные колонки?
Для вопроса я упростил, но вообще там сложные колонки с конкатенацией и всем таким
Помогите пожалуйста
это точно нужно на стороне БД делать?
ну, можно, конечно, сбоку сделать модель, которая будет отображать историю нахождения в командах. и активная команда будет булевым полем обозначаться встречный вопрос есть, почему у игроков ид одинаковые?
Одинаковый айди, потому что раздваиваются строки. Потому что к одному игроку много команд джоинится. Вопрос в том, как собрать эти команды в массив и присвоить игроку, чтобы была одна строка с игроком, и у него поле teams: list[Team]
а, ну, one-to-many в доке
только это many-to-many
я запутался) ты говоришь "присвоить игроку, чтобы была одна строка с игроком, и у него поле teams: list[Team]"
Код, который я прислал даёт такой результат player_id: 10, team: {team_id: 10} player_id: 10, team: {team_id: 20} а я хочу чтобы было так player_id: 10, teams: [{team_id: 10}, {team_id: 20}]
либо кастомным методом для экземляра класса + group_by
query = select( Player.id, func.array_agg(Team) ) \ .join(Player.teams) \ .where(Player.id == player_id) SQL expression element expected, got Team
Вот пример https://stackoverflow.com/questions/23261944/sqlalchemy-postgresql-and-array-agg-how-to-select-items-from-array-agg
Уже открыт этот пример, спасибо
Обсуждают сегодня