Можно ли отображать и отображать отношения сопоставления для определенного класса в SQLA без необходимости вызова clear_mappers()
? Последнее было бы очень глупо, и я подозреваю, что оно будет работать очень плохо.
Backround
У меня есть следующие настройки: Ведомый класс создает несколько объектов типа Fubar и отправляет их через сокет своему Мастеру. Мастер имеет базу данных ORM (через SQLAchemy) и знает, как сопоставить эти объекты с таблицами базы данных. Я хочу, чтобы Рабы не знали ни о какой базе данных. Весь код базы данных находится в Master - инициализация, создание движка и sqlalchemy.orm.mapper(...)
вызовы. Я ожидал, что можно будет абстрагировать всю базу данных с помощью мастер-класса.
Однако я получаю следующее исключение:
Class 'Fubar' is mapped, but this instance lacks instrumentation. This occurs when the instance is created before sqlalchemy.orm.mapper(Fubar) was called.
Этот экземпляр был создан ведомым, который ничего не знает о базе данных. Я не хочу, чтобы он что-либо знал о базе данных или о том, как сопоставить Fubar с таблицами или что-либо вообще. Я просто хочу, чтобы Мастер знал, как это сделать. Поскольку Мастер знает, как отобразить эти классы Фубара, я предположил, что это будет возможно. В конце концов, Мастер получает этот экземпляр класса после того, как сопоставил его с базой данных. Все же я получаю вышеупомянутое исключение.
Кто-нибудь хочет объяснить, что я делаю, что неправильно?
Еще больше деталей ...
Я использую классическое отображение, а не описательные данные в классе, так как я не хочу, чтобы кто-либо импортировал класс, знал, что он может храниться в базе данных, или, скорее, ему не нужно знать детали этого *. 1027 *
Даже используя copy.deepcopy(fubar)
в качестве замены, я все еще получаю эту ошибку. С другой стороны, если я создаю новый объект Fubar в Master с теми же данными, что и старый (из сети) Fubar, то я могу использовать это. Теперь я еще больше растерялся ...
Операция реверса (отправка Фубара от Мастера к Рабу) демонстрирует ту же проблему, что и следующее:
sqlalchemy.orm.exc.UnmappedInstanceError: Cannot deserialize object of type <class 'Fubar'> - no mapper() has been configured for this class within the current Python process!
Итак, теперь вопрос:
Как отображать и удалять объекты в SQLAlchemy?