SQLAlchemy Join для извлечения данных из нескольких таблиц - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь получить данные из нескольких таблиц с помощью SQLAlchemy , используя метод .join () .

Когда я запустил запрос, я ожидал получить единственный объект, в котором были объединены все данные из разных таблиц, чтобы я мог использовать a.area_name и т. Д., Где area_name находится на одной из соединенных таблиц.Ниже приведен запрос, который я выполняю, и макет таблицы. Если бы кто-нибудь мог предложить понимание того, как добиться поведения, к которому я стремлюсь, я был бы очень признателен!Мне удалось использовать метод .join () с тем же синтаксисом для сопоставления результатов и их возврата. Я подумал, что он также будет возвращать дополнительные данные из строк, поскольку он join таблицы (возможно, я неправильно понимаю, как работает метод или как получить информацию через объект запроса?).

Если это помогает при устранении неполадок, я использую MySQL в качестве базы данных

запрос:

a = User.query.filter(User.user_id==1).join(UserGroup,
 User.usergroup==UserGroup.group_id).join(Areas, User.area==Areas.area_id).first()

и таблицы:

class User(db.Model):
    user_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), unique=True)
    usergroup = db.Column(db.Integer, db.ForeignKey('user_group.group_id'), nullable=False)
    area = db.Column(db.Integer, db.ForeignKey('areas.area_id'), nullable=False)

class UserGroups(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    group_id = db.Column(db.Integer, nullable=False, unique=True)
    group_name = db.Column(db.String(64), nullable=False, unique=True)


class Areas(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    area_id = db.Column(db.Integer, nullable=False, unique=True)
    area_name = db.Column(db.String(64), nullable=False, unique=True)

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Так что мне кажется, что мне нужно использовать другой подход к запросу, и он возвращает набор объектов, которые мне затем нужно проанализировать.

То, что сработало:

 a = db.session.query(User, UserGroups, Areas
 ).filter(User.user_id==1
 ).join(UserGroup,User.usergroup==UserGroup.group_id
 ).join(Areas, User.area==Areas.area_id
 ).first()

Остальное осталось прежним.Затем это вернуло кортеж, который я мог бы проанализировать, где данные от User - это [0], от UserGroups - [1], а Areas - [2].Затем я могу получить доступ к столбцу имя_группы с помощью a [1] .group_name и т. Д.

Надеюсь, это поможет кому-то еще, кто пытается работать с этим!

0 голосов
/ 14 мая 2018

Взгляните на функцию relationship SQLAlchemy:

http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-many

Вы можете добавить новый атрибут в свой класс User, например:

group = sqlalchemy.relationship('UserGroups', back_populates='users')

Это автоматически разрешит отношение один-ко-многим между User и UserGroups (при условии, что пользователь может быть только членом одной группы пользователей одновременно). Затем вы можете просто получить доступ к атрибутам группы пользователей, как только вы запросили пользователя (или набор пользователей) из вашей базы данных:

a = User.query.filter(...).first()
print(a.group.group_name)

SQLAlchemy разрешает соединения для вас, вам не нужно явно объединять внешние таблицы при запросах.

Возможен и обратный доступ; если вы просто запросите группу пользователей, вы сможете получить доступ к соответствующим членам напрямую (через аргумент back_populates -keyword):

g = UserGroup.query.filter(...).first()
for u in g.users:
    print(u.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...