2013-01-31 46 views
18

我想使用orm複製SQLAlchemy中的模型實例(行)。我首先想到的是要做到這一點:SQLAlchemy:修改分離對象

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,即使我將ID設置爲無,而這是超脫。因此,session.flush()嘗試執行UPDATE,將主鍵更改爲null。

這是預期的行爲?如何刪除此屬性的「內存」,並將分離的對象重新添加到會話時將其視爲新對象?一般來說,如何克隆SQLAlchemy模型實例?

回答

34

這種情況下可使用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 
+0

謝謝,沒有看到它的文檔。 –

+4

複製關係以及@zzzeek的正確方法是什麼? – jmagnusson

+0

我也對類似的東西感興趣。我有興趣將克隆一個實體(一行)及其所有「子」實體(其他表中的行,外鍵指向此行),並將此新的重複行及其重複的子行附加到新的父實體通過新的重複行中的不同外鍵(但不影響現有實體及其子實體)。我可以在另一個問題上看到這個部分的答案,因此:http://stackoverflow.com/questions/20112850/sqlalchemy-clone-table-row-with-relations?lq=1 – Soferio

1
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) 
+0

如果你的對象是「掛起」,這doesn沒有任何關係。即那麼外鍵列尚未填充。 – gromgull

+0

它也不復制方法和混合屬性。 – Jakobovski