Saltar al contenido

ÚNETE a la misma tabla dos veces con alias en SQLAlchemy

Solución:

Me di cuenta de esto. Estas son las clases que se utilizan en mi aplicación Flask:

class User(Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = Column(db.String(80), unique=True, nullable=False)
    skills = db.relationship('UserSkill')

class Skill(Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = Column(db.String(80))

class UserSkill(Model):
    status = db.Column(db.Enum(SkillStatus))
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
    skill_id = db.Column(db.Integer, db.ForeignKey('skills.id'), primary_key=True)
    skill = db.relationship("Skill")

Entonces, el código real se vería así:

userSkillF = aliased(UserSkill)
userSkillI = aliased(UserSkill)
skillF = aliased(Skill)
skillI = aliased(Skill)

db.session.query(User.id, User.username,
         func.group_concat(func.distinct(skillF.name)).label('skills'),
         func.group_concat(func.distinct(skillI.name)).label('other_skills')).
    join(userSkillF, User.skills).
    join(userSkillI, User.skills).
    join(skillF, userSkillF.skill).filter(skillF.id.in_(skillIds)).
    join(skillI, userSkillI.skill).
    group_by(User.id).all()

Muchas gracias Ilja Everilä, una nueva mirada a los documentos de SqlAlchemy me hizo entender aliased ahora.

También podemos hacer la unión sin relaciones. Mencione explícitamente la condición de unirse.

Ejemplo

 user1=aliased(UserSkill)
 user2=aliased(UserSkill)
 query_result = db.session.query(func.distinct(User.id).label('user_id'),User.username).
     join(user1,User.id==user1.user_id).
     join(user2,user2.id== User.id).
     filter(user1.user_id==id).all()
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *