Определено «многие ко многим» с помощью таблицы связей в SQLAlchemy.Python

Программы на Python
Anonymous
Определено «многие ко многим» с помощью таблицы связей в SQLAlchemy.

Сообщение Anonymous »

Обновление более полного примера
Я видел много решений, но все еще не могу заставить это работать.
У меня

Код: Выделить всё

class ModuleGroupMember(ModelBase):
__tablename__ = 'module_group_member'
pk = mapped_column(Integer, primary_key=True)
module_pk = mapped_column(Integer, ForeignKey('module.pk'))
module_group_pk = mapped_column(Integer, ForeignKey('module_group.pk'))

class Module(ModelBase):
__tablename__ = 'module'
pk = mapped_column(Integer, primary_key=True)
name = mapped_column(String)
groups = relationship("Module_Group", secondary="module_group_member", back_populates="modules")

class ModuleGroup(ModelBase):
__tablename__ = 'module_group'
pk = mapped_column(Integer, primary_key=True)
description = mapped_column(String)
is_active = mapped_column(Boolean)
name = mapped_column(String)
modules = relationship("Module", secondary="module_group_member", back_populates="groups")
Все они находятся в отдельных файлах Module.py, ModuleGroup.py и ModuleGroupMember.py, которые находятся в пакете root.db.models. У меня есть __init__.py вот такой

Код: Выделить всё

from .Module import Module
from .Module_Group import ModuleGroup
from .Module_Group_Member import ModuleGroupMember

metadata = ModelBase.metadata

def create_tables():
metadata.create_all(engine)

def drop_tables():
metadata.drop_all(engine)
Мне не ясно, является ли вторичный параметр именем таблицы или именем класса, но я пробовал и то, и другое.
Когда я запускаю create_all(), таблицы не создаются. Вот что я выполняю. Обратите внимание, что я импортирую все из root.db.models

Код: Выделить всё

from sqlalchemy import create_engine, URL
from sqlalchemy.orm import sessionmaker, DeclarativeBase

from root.db.models import create_tables, Module, drop_tables

url = URL.create(
drivername="postgresql",
username="postgres",
password="postgres",
host="localhost",
database="flask_test"
)
engine = create_engine(url, echo=True)

class ModelBase(DeclarativeBase):
pass

metadata = ModelBase.metadata
drop_tables()
create_tables()

with sessionmaker(bind=engine)() as session:
with session.begin():
session.add(Module(name="Module1"))
session.commit()

Я получаю следующую ошибку при попытке добавить строку в таблицу модулей

Код: Выделить всё

    raise NameError( NameError: Module 'Module_Group' has no mapped classes registered under the name '_sa_instance_state'


Подробнее здесь: https://stackoverflow.com/questions/786 ... sqlalchemy

Вернуться в «Python»