2011-09-29 89 views
1

我正在嘗試創建一個程序,該程序從數據庫中加載超過100個表,以便可以更改用戶用戶標識的所有外觀。SQLAlchemy:動態加載列表中的表

與其單獨映射所有表,我決定使用循環來映射每個表使用對象數組。這樣,表定義可以存儲在配置文件中,並在以後更新。

這是到目前爲止我的代碼:

def init_model(engine): 
    """Call me before using any of the tables or classes in the model""" 
    meta.Session.configure(bind=engine) 
    meta.engine = engine 

class Table: 
    tableID = '' 
    primaryKey = '' 
    pkType = sa.types.String() 
    class mappedClass(object): 
     pass 


WIW_TBL = Table() 
LOCATIONS_TBL = Table() 

WIW_TBL.tableID = "wiw_tbl" 
WIW_TBL.primaryKey = "PORTAL_USERID" 
WIW_TBL.pkType = sa.types.String() 

LOCATIONS_TBL.tableID = "locations_tbl" 
LOCATIONS_TBL.primaryKey = "LOCATION_CODE" 
LOCATIONS_TBL.pkType = sa.types.Integer() 

tableList = ([WIW_TBL, LOCATIONS_TBL]) 

for i in tableList: 

    i.tableID = sa.Table(i.tableID.upper(), meta.metadata, 
    sa.Column(i.primaryKey, i.pkType, primary_key=True), 
    autoload=True, 
    autoload_with=engine) 

    orm.mapper(i.mappedClass, i.tableID) 

,該代碼返回的錯誤是:

sqlalchemy.exc.ArgumentError: Class '<class 'changeofname.model.mappedClass'>' already has a primary mapper defined. Use non_primary=True to create a non primary Mapper. clear_mappers() will remove *all* current mappers from all classes. 

,因爲它抹布的所有類和ENTITY_NAME方案沒有按」我不能使用clear_mappers這似乎適用於這裏。

似乎每個對象都想使用同一個類,儘管它們都應該有它自己的實例。

有沒有人有任何想法?

回答

1

那麼,在你的情況下,它* 相同Class你試圖映射到不同的Table s。爲了解決這個問題,動態地創建一個類爲每個Table

class Table(object): 
    tableID = '' 
    primaryKey = '' 
    pkType = sa.types.String() 
    def __init__(self): 
     self.mappedClass = type('TempClass', (object,), {}) 

但我寧願稍微乾淨的版本:

class Table2(object): 
    def __init__(self, table_id, pk_name, pk_type): 
     self.tableID = table_id 
     self.primaryKey = pk_name 
     self.pkType = pk_type 
     self.mappedClass = type('Class_' + self.tableID, (object,), {}) 
# ... 
WIW_TBL = Table2("wiw_tbl", "PORTAL_USERID", sa.types.String()) 
LOCATIONS_TBL = Table2("locations_tbl", "LOCATION_CODE", sa.types.Integer()) 
+0

完美的,那正是我需要的!我一直在嘗試type(),但沒有成功。謝謝你,非常感謝! 儘管由於某種原因它並沒有傳遞給視圖,但我想不出來:D – JackalopeZero

+0

爲了在導入時看到類,您應該將它們添加到'globals()'中。例如:在'self.mappedClass = type('Class_'+ self.tableID,(object,),{})'行添加'globals()['Class_'+ self.tableID] = self.mappedClass'行後。在這種情況下,視圖將能夠導入類「Class_locations_tbl」和「Class_wiw_tbl」 – van