2010-05-19 39 views
1

我有一個鏈接到MySQL的SQLAlchemy ORM類,它非常適合將我需要的數據保存到基礎表。不過,我也想保存相同的數據到第二個存檔表。如何使用一個SQLAlchemy模型保存到兩個表格

下面是一些psudocode,試圖解釋一下我的意思是

my_data = Data() #An ORM Class 
my_data.name = "foo" 

#This saves just to the 'data' table 
session.add(my_data) 

#This will save it to the identical 'backup_data' table 
my_data_archive = my_data 
my_data_archive.__tablename__ = 'backup_data' 
session.add(my_data_archive) 

#And commits them both 
session.commit() 

剛擡起頭,我不感興趣的一類映射到一個JOIN,如:http://www.sqlalchemy.org/docs/05/mappers.html#mapping-a-class-against-multiple-tables

+0

我很難想象這個副本會給你買什麼。你想達到什麼目的?這可能更符合MySQL的操作,讓DBM在您的應用層保持簡單的狀態下執行冗餘。 – msw 2010-05-19 11:26:54

+0

對不起,讓我澄清一下: 數據表將在稍後進行處理和彙總,但我們仍然希望所有原始數據用於審計目的。因此,未改變的數據也應該保存在data_backup表中。 (這些都是示例名稱) – 0atman 2010-05-19 12:11:39

+0

另外,我認爲在數據庫中放置邏輯(如您所建議的)會傷害我的應用程序。 – 0atman 2010-05-19 12:38:51

回答

3

我列出了一些選項下面。如果您不需要處理模型中的這些對象,那麼我會選擇數據庫觸發器。

+0

非常感謝您的幫助,但即使閱讀了您提供給我的資源後,我也不確定如何繼續。你能否給我一個小例子,非常簡單地將單個模型保存到兩個數據庫表中?真的越簡單越好。 – 0atman 2010-05-19 12:13:24

+0

+1爲觸發器解決方案 – stephan 2010-05-20 07:14:08

+0

一個觸發器當然很簡單,但它意味着把邏輯數據庫中的權利?我不確定這是最好的方法...... – 0atman 2010-05-20 09:10:43

1

創建2個相同的模型:一個映射到主表和另一個映射到存檔表。使用重新定義的方法after_insert()創建MapperExtension(根據您的需求,您可能還需要after_update()after_delete())。此方法應將主模型中的數據複製到存檔並將其添加到會話中。有一些技巧可以自動複製所有列和多對多關係。

注意,那你就必須flush()會議兩次來存儲對象,因爲工作單位映射器擴展之前計算增加了新的對象到會話中。你可以重新定義Session.flush()來照顧這個問題。當對象被刷新時,也會自動增加字段,所以如果您也需要它們,則必須延遲複製。

這是一種可能的情況,它被證明是有效的。我想知道是否有更好的方法。

相關問題