Как распечатать результат ассоциативной таблицы - PullRequest
1 голос
/ 01 августа 2020

У меня есть пользователь и таблица ветвей, и у нее есть отношения «многие ко многим». Следовательно, я определил таблицу ассоциаций.

user_branch_map = db.Table(
    'user_branch_map',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('branch_id', db.Integer, db.ForeignKey('branch.id'), primary_key=True)
    )

таблица user_branch_map имеет следующее содержимое: 1006 * Как я могу распечатать результат user_branch_map не идентификаторы, а результат соединения таблицы пользователей и ветвей. Я могу распечатать информацию таблицы ветвей, но мне также нужна информация о пользователе. Я пробовал следующие способы:

def get(self):
    # maptable= User.query.join(user_branch_map).join(Branch). \
    # filter((user_branch_map.c.user_id == User.id) & (user_branch_map.c.branch_id == Branch.id)).all()
    # print(type(maptable))
    # # maptable = db.session.query(user_branch_map).join(User).all()
    # # print(maptable)
    # for row in maptable:
    #     print(row)


    # branches = db.session.query(Branch).all()
    # q = db.session.query(User).options(eagerload(User.branches))
    # for u in q.all():
    #     for c in branches:
    #         print (c.id, c.name,(c in u.branches))

    q = db.session.query(user_branch_map).join(Branch).join(User).all()
    print(q)

Ответы [ 2 ]

1 голос
/ 02 августа 2020

db.session.query (User.id, User.full_name, Branch.id, Branch.name) .filter (user_branch_map. c .user_id == User.id) .filter (user_branch_map. c. branch_id == Branch.id)

0 голосов
/ 01 августа 2020

Я думаю, вы хотите получить ветки для каждого пользователя, поэтому что-то вроде username, branchname должно позволить вам расширить его оттуда. Если вы определяете модель User как

class User(db.Model):
  ...
  branches = db.relationship("Branch", secondary=user_branch_map, backref="users")
  ...

, вам просто нужно присоединить User к Branch, а SQLAlchemy сделает все остальное:

q = q = db.session.query(User.username, Branch.branch_name).select_from(User).join(user_branch_map).join(Branch).all()

Это должно сгенерировать следующие SQL:

SELECT user.username, branch.branch_name
FROM user
JOIN user_branch_map ON user.id = user_id
JOIN branch ON branch.id = branch_id

И использование backref="users" должно также сделать атрибут users для Branch доступным (см. docs )

...