Я работаю над библиотекой, в которой пользователь сможет просто объявить несколько классов, которые автоматически поддерживаются базой данных. Короче, где-то спрятано в коде, там есть
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
, чтобы я мог поменять его определение на новое?