Как клонировать объект db sqlalchemy с новым первичным ключом
Я хочу клонировать объект sqlalchemy:
Я попробовал его
product_obj = products.all()[0] #here products is service name
product_obj.product_uid = 'soemthing' #here product_uid is the pk of product model
products.save(product_obj)
он просто обновляет только старый_объект
вот код функции products.save
class Service(object):
__model__ = None
def save(self, model):
self._isinstance(model)
db.session.add(model)
db.session.commit()
return model
Ответы
Ответ 1
Это должно работать:
product_obj = products.all()[0]
db.session.expunge(product_obj) # expunge the object from session
make_transient(product_obj) # http://docs.sqlalchemy.org/en/rel_1_1/orm/session_api.html#sqlalchemy.orm.session.make_transient
product_obj.product_uid = 'something'
db.session.add(product_obj)
Ответ 2
Одним из возможных подходов является использование dictalchemy:
new_instance = InstanceModel(**old_instance.asdict())
Ответ 3
Для sqlalchemy 1.3 я использовал вспомогательную функцию.
- Он копирует все столбцы без первичного ключа из входной модели в новый экземпляр модели.
- Это позволяет передавать данные непосредственно в качестве аргументов ключевых слов.
- Это оставляет исходный объект модели неизменным.
def clone_model(model, **kwargs):
"""Clone an arbitrary sqlalchemy model object without its primary key values."""
# Ensure the models data is loaded before copying.
model.id
table = model.__table__
non_pk_columns = [k for k in table.columns.keys() if k not in table.primary_key]
data = {c: getattr(model, c) for c in non_pk_columns}
data.update(kwargs)
clone = model.__class__(**data)
db.session.add(clone)
db.session.commit()
return clone
С помощью этой функции вы можете решить вышеуказанную проблему, используя:
product_obj = products.all()[0] # Get the product from somewhere.
cloned_product_obj = clone_model(product_obj, product_uid='something')
В зависимости от вашего db.session.commit()
использования вы можете удалить вызов db.session.commit()
из этой функции.
Этот ответ основан на fooobar.com/info/58652/... (Как получить столбцы моделей?) И Как получить имя первичного ключа объекта SQLAlchemy? (Как мне получить модели первичных ключей?).