如何在SQLAlChemy中查询关联表?

2022-03-10 00:00:00 python sqlalchemy flask-sqlalchemy sql

问题描述

我正在尝试将SQL查询转换为对GET API内部用户的SQLAlChemy查询。问题是我不能从关联表中查询任何东西。(我确定我不知道方法)。

ORM:

roles_users = db.Table(
    'roles_users',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
     )

class Role(db.Model, RoleMixin):
   id = db.Column(db.Integer(), primary_key=True)
   name = db.Column(db.String(50), unique=True)
   description = db.Column(db.String(255))

   def __str__(self):
      return self.name

class User(db.Model, UserMixin):
   id = db.Column(db.Integer, primary_key=True)
   first_name = db.Column(db.String(50))
   last_name = db.Column(db.String(50))
   email = db.Column(db.String(50), unique=True)
   password = db.Column(db.String(255))
        .
        .
        .
   roles = db.relationship('Role', secondary=roles_users,
                        backref=db.backref('users', lazy='dynamic'))

   def __str__(self):
       return self.email

正在处理SQL查询:

select first_name, last_name, role.name from user 
    join roles_users 
       join role on user.id = roles_users.user_id 
           and role.id = roles_users.role_id;

我遇到问题的SQLAlChemy查询:

roles_users.query.join(Role).join(User)
   .filter(roles_users.user_id == User.id and 
       roles_users.role_id == Role.id).all()

我使用上述SQLAlChemy查询时遇到的错误:

AttributeError: 'Table' object has no attribute 'query'

如何使用SQLAlChemy执行与SQL查询等效的操作?


解决方案

OK,所以在Flask-SQL炼金术中查询关联对象的关键是对ROLES_USERS进行外部联接。试着先加入所有的桌子,然后再加入过滤。我将在下面发布答案。

query_user_role = User.query.join(roles_users).join(Role).
filter((roles_users.c.user_id == User.id) & (roles_users.c.role_id == Role.id)).all()

查询关联表对象时不要忘了放‘c’。没有它,它就不会工作。

还有一件事,不要忘记设置backref lazy=‘join’

相关文章