Если вам нужно навсегда удалить класс, просто избавьтесь от картографа:
sqlalchemy.orm.class_mapper(Worker).dispose()
Инструментарий SQLAlchemy живет как дескриптор свойства объекта класса. Поэтому, если вам нужны отдельные деинструментированные версии объектов, вам нужно создать версию класса, у которой нет дескрипторов в его иерархии типов.
Хорошим способом было бы иметь постоянный подкласс для каждого класса модели и создавать сопоставители для постоянных классов. Вот декоратор класса, который создает для вас подкласс и добавляет его в качестве атрибута класса к оригиналу:
def deinstrumentable(cls):
"""Create a deinstrumentable subclass of the class."""
def deinstrument(self):
"""Create a non-instrumented copy of the object."""
obj = cls.__new__(cls)
obj.__dict__.update(self.__dict__)
del obj._sa_instance_state
return obj
persistent = type('Persisted%s' % cls.__name__, (cls,), {
'Base': cls,
'deinstrument': deinstrument
})
return persistent
Вы бы использовали это в определении так:
@deinstrumentable
class Worker(object):
def earnings(self):
return self.wage*self.hours
mapper(Worker, workers)
А если у вас есть постоянный объект, вы можете создать его деинструментированную версию, например:
worker = session.query(Worker).first()
detached_worker = worker.deinstrument()
Вы можете создать деинструментированную версию прямо так:
detached_worker = Worker.Base()