Можно ли добавить новый элемент на основе другой строки базы данных в SQLAlchemy?

Как видно из названия, я хочу добавить строку с идентификатором на основе другой строки в SQLALchemy. В настоящее время я добавляю дополнительный select, но я бы хотел избавиться от этого. Я знаю, что это возможно в MySQL, поэтому я просто пытаюсь выяснить версию SQLAlchemy. Вот что я сейчас имею:

keywords = ['a', 'b', 'c']
prefix_id = session.query(Prefix.id)\
    .filter_by(name=some_prefix).first()[0]
inventory_item = InventoryItem(
    item=some_item, prefix_id=prefix_id, address=some_address)
inventory_item_metas = [InventoryItemMeta(
    inventory_item=inventory_item,
    type='keyword',
    value=keyword) for keyword in keywords]

Обратите внимание, что я добавляю больше элементов, основанных на возвращенном id, поэтому я хотел бы сделать все в одной транзакции максимально эффективно.

Ответ 1

Если i0 - объект, который вы хотите скопировать, вы можете удалить его из сеанса, чтобы сделать его переходным:

i0 = select
session.expunge(i0)

Затем вы установите его id на None, чтобы он больше не ссылался на какую-либо реальную строку базы данных:

i0.id = None

Затем вы можете изменить объект:

i0.a = 1
i0.b = 2

И, наконец, вы добавите переходный объект обратно в сеанс и очистите его, чтобы получить для него новый id:

session.add(i0)
session.flush()

Вы обнаружите, что объект теперь представляет собой новую строку:

print i0.id #New ID

И если вы посмотрите на старый идентификатор, у вас будет еще один объект, такой же, как и до изменений, с исходным идентификатором.