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