У меня есть следующие сущности, каждая из которых представляет собой таблицу в моей базе данных:sqlalchemy- три организации присоединились через одну таблицу
User
Application
Role
Я еще одна таблица под названием «user_app_role», который выглядит следующим образом:
table user_app_role(
user_id int not null ,
application_id int not null,
role_id int not null,
primary key(user_id, application_id, role_id)
)
где user_id, application_id и role_id - все внешние ключи в таблицах пользователя, приложения и ролей.
Запись в этой таблице указывает, что пользователь имеет определенную роль в конкретном приложении, поэтому строка может возвращать 1, 1, 1
, указав, что пользователь 1 имеет роль 1 в приложении 1. Аналогично, 1, 2, 1
будет означать, что пользователь 1 также имеет роль 2 в приложении 1.
У меня есть сопоставления sqlalchemy, определенные для пользователя, приложения и роли. Я хотел бы, чтобы объект User каким-то образом имел список объектов приложения и для каждого объекта приложения, этот объект будет содержать список объектов Role.
Из чтения документации по sqlalchemy, похоже, этот тип отношений невозможно сопоставить, и я нашел только несколько других вопросов о stackoverflow, где это было задано, ни один из которых не имеет ответа. Это похоже на относительно нормальное отношение базы данных 3NF (у меня 4 из них в моей модели данных), можно ли как-то установить это в sqlalchemy? Я мог бы сделать все это в чистом SQL за 10 минут, но я не хочу выбрасывать всю другую полезную функцию SqlAlchemy, но если я не могу сделать это как-то работать, то мое приложение не сможет отправить.
Кроме того, ПОЖАЛУЙСТА, НЕ ПРЕДУСМАТРИВАЙТЕ, что я просто изменяю свою модель данных или денормализую базу данных или каким-либо образом обманываю ее. Ответы такого характера мне не помогут. Я рад изменить мою объектную модель или добавить дополнительные объекты, если мне нужно каким-то волшебным образом отобразить эту таблицу на 2 объекта или что-то странное, но я не могу изменить модель данных.
Я до сих пор не нашел подходящего решения для этого, но я создал отдельный объект UserAppRole и использовал отношения в объекте User, чтобы присоединиться к UserAppRole. Поскольку я могу загружать объекты Application и Role (и их очень мало), то мой уровень persistence просто подключает значения вручную в тех очень редких случаях, когда идентификатора недостаточно (в основном для отображения в пользовательском интерфейсе где-то). Я отправлю ответ с более подробной информацией, если не получу лучшего ответа в течение следующих нескольких дней. –