Подтвердить что ты не робот

SQLAlchemy: изменение отдельного объекта

Я хочу дублировать экземпляр модели (строку) в 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?

4b9b3361

Ответ 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

Ответ 2

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)