2011-09-29 46 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