Ответ 1
этот случай доступен с помощью вспомогательной функции make_transient():
inst = session.query(Model).first()
session.expunge(inst)
make_transient(inst)
inst.id = None
session.add(inst)
session.flush()
print inst.id #New ID
Я хочу дублировать экземпляр модели (строку) в SQLAlchemy с помощью orm. Моя первая мысль заключалась в том, чтобы сделать это:
i = session.query(Model)
session.expunge(i)
old_id = i.id
i.id = None
session.add(i)
session.flush()
print i.id #New ID
Однако, по-видимому, отдельный объект все еще "помнит", какой у него был идентификатор, хотя я установил id в None, пока он был отсоединен. Таким образом, session.flush() пытается выполнить UPDATE, изменяя первичный ключ на нуль.
Является ли это ожидаемым поведением? Как я могу удалить "память" этого атрибута и просто рассматривать отдельный объект как новый объект при повторном добавлении его в сеанс? Как, в общем, клонирует экземпляр модели SQLAlchemy?
этот случай доступен с помощью вспомогательной функции make_transient():
inst = session.query(Model).first()
session.expunge(inst)
make_transient(inst)
inst.id = None
session.add(inst)
session.flush()
print inst.id #New ID
def duplicate(self):
arguments = dict()
for name, column in self.__mapper__.columns.items():
if not (column.primary_key or column.unique):
arguments[name] = getattr(self, name)
return self.__class__(**arguments)