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

Тем не менее, очевидно, что отсоединенный объект все еще «запоминает», какой у него был идентификатор, хотя я установил для него значение «Нет», пока он был отсоединен. Таким образом, session.flush () пытается выполнить ОБНОВЛЕНИЕ, изменяя первичный ключ на ноль.

Это ожидаемое поведение? Как я могу удалить «память» этого атрибута и просто обработать отсоединенный объект как новый объект после повторного добавления его в сеанс? Как вообще можно клонировать экземпляр модели SQLAlchemy?

22
EB. 1 Фев 2013 в 02:19

2 ответа

Лучший ответ

Этот случай доступен с помощью 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
40
Stephen Fuhry 19 Мар 2016 в 12:39
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)
1
user4183320user4183320 1 Мар 2015 в 03:00