У меня есть база данных с таблицами с именами qs_dashboard и Profile, которые связаны с промежуточной таблицей с именем Dashboard_permissions. Моя проблема заключается в том, что когда я пытаюсь добавить связь в свои модели SQLAlchemy из Dashboard в Profile через Dashboard_permissions.profile_id, я получаю следующую ошибку, независимо от того, тестирует ли мой код новый отношения:
NameError: Module 'qs_dashboard_permission' has no mapped classes registered under the name '_sa_instance_state'
Я понятия не имею, что означает _sa_instance_state.
Трассировка стека указывает на первый раз, когда оценивается запрос. Пример:
query = select(Profile).filter(Profile.uuid == 'some uuid')
profile: Profile = session.scalars(query).first()
Соответствующие части моей схемы следующие:
- панель управления
id
строка - PK
[*]dashboard_permissions
- dashboard_id
строка - PK
- FK -> панель управления
[*]profile_id
- целое число
- PK
- FK -> профиль
- целое число
- FK -> профиль
- Этот элемент не следует использовать для сопоставления панели управления с профилем
[*]профиль
- id
целое число - PK
Попытки решения
- Я попробовал несколько различных конфигураций для Dashboard.profiles включая использование параметров перекрытия и back_populates, но я продолжаю получать одно и то же сообщение об ошибке.
- Когда я удаляю Dashboard.profiles, все мои модульные тесты начинают работать опять же, кроме тех, которые используют Dasboard.profiles.
dashboard.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .profile import Profile
from .dashboard_permission import DashboardPermissions
else:
Profile = 'Profile'
DashboardPermissions = 'DashboardPermissions'
from . import Base
from sqlalchemy import (
String,
)
from sqlalchemy.orm import (
mapped_column,
relationship,
Mapped,
DynamicMapped,
)
class Dashboard(Base):
__tablename__ = 'dashboard'
id: Mapped[str] = mapped_column(String, primary_key = True)
profiles: DynamicMapped[Profile] = relationship(Profile,
lazy = 'dynamic',
secondary = 'dashboard_permission',
foreign_keys = 'DashboardPermissions.profile_id',
#overlaps = 'qs_dashboard_permissions',
#back_populates = 'dashboards',
)
profile.py
from sqlalchemy import Integer
from sqlalchemy.orm import (
mapped_column,
Mapped,
)
class Profile(Base):
__tablename__ = 'profile'
id: Mapped[Integer] = mapped_column(Integer, primary_key = True, index = True, unique = True)
dashboard_permissions.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .profile import Profile
from .dashboard import Dashboard
else:
Profile = 'Profile'
Dashboard = 'Dashboard'
from . import Base
from sqlalchemy import (
ForeignKey,
Integer,
String,
)
from sqlalchemy.orm import (
relationship,
mapped_column,
Mapped,
)
from sqlalchemy import (
DateTime,
)
from .enums.qs_permission import QsPermission
import boto3
cognito = boto3.client('cognito-idp')
class DashboardPermissions(Base):
__tablename__ = 'dashboard_permissions'
profile_id: Mapped[int] = mapped_column(Integer, ForeignKey('profile.id'), primary_key = True)
profile: Mapped[Profile] = relationship(Profile, foreign_keys = [profile_id], back_populates = 'dashboard_permissions', overlaps='dashboard_permissions')
dashboard_id: Mapped[str] = mapped_column(String, ForeignKey('dashboard.id'), primary_key = True)
dashboard: Mapped[Dashboard] = relationship(Dashboard, foreign_keys = [dashboard_id], overlaps='dashboard_permissions')
shared_by_id: Mapped[int] = mapped_column(Integer, ForeignKey('profile.id'))
shared_by: Mapped[Profile] = relationship(Profile, foreign_keys = [shared_by_id], back_populates = 'dashboard_permissions_shared', overlaps='dashboard_permissions')
Подробнее здесь: https://stackoverflow.com/questions/789 ... apped-clas