2016-12-21 4 views
1

Ich versuche, eine SQL-Abfrage in eine SQLAlchemy-Abfrage zu Benutzer innerhalb get API zu konvertieren. Das Problem ist, dass ich nichts aus der Zuordnungstabelle abfragen kann. (Ich bin mir sicher, dass ich die Methode nicht kenne).Wie frage ich eine Zuordnungstabelle in 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 

Arbeits SQL-Abfrage:

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 Abfrage, die ich habe Probleme mit:

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

Fehler, die ich verwende oben SQLAlchemy Abfrage erhalten:

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

Wie führe ich das Äquivalent von meiner SQL-Abfrage mit SQLAlchemy?

Antwort

4

Ok, also der Schlüssel zum Abfragen von Assoziationsobjekt in Flask-Sql Alchemie ist eine externe Verknüpfung zu roles_users zu machen. Versuchen Sie zunächst, alle Tabellen zu verbinden und anschließend zu filtern. Ich schreibe die Antwort unten.

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

Vergessen Sie nicht, 'c' beim Abfragen des Assoziationstabellenobjekts zu setzen. Ohne es wird es nicht funktionieren.

Eine weitere Sache, vergessen Sie nicht backref faul setzen = ‚verbunden‘

+2

Der boolean 'und' sollte binär' & ', oder Sie werden überraschende Ergebnisse erhalten werden. Sie können auch die 'and_' Funktion von sqla verwenden. In diesem Fall ist die linke Seite "truthy" (ein sql-Ausdrucksobjekt), so dass der boolesche Ausdruck auf der rechten Seite "roles_users.c.role_id == Role.id" ausgewertet wird. –

+0

Bei Verwendung von '&' linken und rechten Seiten muss in Klammern 'Filter ((roles_users.c.user_id == User.id) & (roles_users.c.Role_ID == Role.id))' –

Verwandte Themen