Flask sqlalchemy. Фильтрация данных в таблице бд, в которой имеется несколько связей на одну и ту же таблицу
Имею модель таблицы пользователей:
class users(db.Model):
__tablename__ = 'users'
__table_args__ = {'schema': '123'}
id = db.Column(name="id", type_=db.Integer, primary_key=True, autoincrement=True)
user_name = db.Column(name="user_name", type_=db.String(45))
user_role_id = db.Column("user_role_id", db.Integer, db.ForeignKey('viepp_online.users_roles.id'))
user_role = db.relationship("users_roles")
login = db.Column(name="login", type_=db.String(256))
password = db.Column(name="password", type_=db.String(100))
delete = db.Column(name="delete", type_=db.LargeBinary)
sex_id = db.Column(name="sex_id", type_=db.Integer)
first_name_nominative = db.Column(name="first_name_nominative", type_=db.String(45))
last_name_nominative = db.Column(name="last_name_nominative", type_=db.String(45))
second_name_nominative = db.Column(name="second_name_nominative", type_=db.String(45))
first_name_genitive = db.Column(name="first_name_genitive", type_=db.String(45))
last_name_genitive = db.Column(name="last_name_genitive", type_=db.String(45))
second_name_genitive = db.Column(name="second_name_genitive", type_=db.String(45))
first_name_dative = db.Column(name="first_name_dative", type_=db.String(45))
last_name_dative = db.Column(name="last_name_dative", type_=db.String(45))
second_name_dative = db.Column(name="second_name_dative", type_=db.String(45))
user_password = db.Column(name="user_password", type_=db.String)
Модель таблицы заявления:
class statements(db.Model):
__tablename__ = 'statements'
__table_args__ = {'schema': '123'}
id = db.Column(name="id", type_=db.Integer, primary_key=True, autoincrement=True)
reg_number = db.Column("reg_number", db.String)
user_id = db.Column("user_id", db.Integer , db.ForeignKey('viepp_online.users.id'))
user = db.relationship("users", foreign_keys=[user_id])
create_user = db.Column("create_user", db.Integer , db.ForeignKey('viepp_online.users.id'))
cr_user = db.relationship("users", foreign_keys=[create_user])
statement_type_id = db.Column("statement_type_id", db.Integer , db.ForeignKey('viepp_online.statements_types.id'))
statement_type = db.relationship("statements_types", foreign_keys=[statement_type_id])
data = db.Column(name="data", type_=db.JSON)
xml_data = db.Column(name="xml_data", type_=db.String)
create_date = db.Column(name="create_date", type_=db.DateTime)
statement_par_id = db.Column(name="statement_par_id", type_=db.Integer)
Пытаюсь выполнить следующий запрос:
db.session.query(statements).join(users, users.id == statements.user_id).filter(users.user_name.like("%Петров%")).join(users, users.id == statements.create_user).filter(users.user_name.like("%Сидоров%")).all()
Кидается исключение:
(pymysql.err.OperationalError) (1066, "Not unique table/alias...
Как правильно мне отсортировать данные в таблице заявлений (statements) по двум пользователям? Стек: python3, flask, sqlalchemy
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Пользуйтесь aliased:
usersId = aliased(users)
usersCreate = aliased(users)
db.session.query(statements)\
.join(usersId, statements.user_id)\
.filter(usersId.user_name.like("%Петров%"))\
.join(usersCreate, statements.create_user)\
.filter(usersCreate.user_name.like("%Сидоров%"))\
.all()