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這似乎適用於這裏。
似乎每個對象都想使用同一個類,儘管它們都應該有它自己的實例。
有沒有人有任何想法?
完美的,那正是我需要的!我一直在嘗試type(),但沒有成功。謝謝你,非常感謝! 儘管由於某種原因它並沒有傳遞給視圖,但我想不出來:D – JackalopeZero
爲了在導入時看到類,您應該將它們添加到'globals()'中。例如:在'self.mappedClass = type('Class_'+ self.tableID,(object,),{})'行添加'globals()['Class_'+ self.tableID] = self.mappedClass'行後。在這種情況下,視圖將能夠導入類「Class_locations_tbl」和「Class_wiw_tbl」 – van