Я работаю над библиотекой, где пользователь сможет просто объявить несколько классов, которые автоматически поддерживаются базой данных. Короче говоря, где-то в коде скрыто
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class LibraryBase(Base):
# important library stuff
, и пользователь должен затем выполнить
class MyStuff(LibraryBase):
# important personal stuff
class MyStuff_2(LibraryBase):
# important personal stuff
mystuff = MyStuff()
Library.register(mystuff)
mystuff.changeIt() # apply some changes to the instance
Library.save(mystuff) # and save it
# same for all other classes
. В статической среде, например, пользователь создал один файл со всеми личными классами и импортирует этот файл, это работает очень хорошо. Все имена классов фиксированы, и SQLAlchemy знает, как сопоставить каждый класс.
В интерактивной среде все по-другому: Теперь есть шанс, что класс будет определен дважды. У обоих классов могут быть разные модули; но SQLAlchemy все равно будет жаловаться:
SAWarning: имя класса 'MyStuff' уже находится в реестре этой декларативной базы, сопоставлено с
Есть способ справиться с этим? Могу ли я каким-то образом выгрузить класс из его declarative_base
, чтобы я мог заменить его определение новым?