Можно ли добавить новый элемент на основе другой строки базы данных в 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
И если вы посмотрите на старый идентификатор, у вас будет еще один объект, такой же, как и до изменений, с исходным идентификатором.