我正在尝试创建一个从数据库加载超过100个表的程序,以便我可以更改用户用户ID的所有外观。
我决定使用一个循环来使用一个对象数组来映射每个表,而不是单独映射所有表。这样,表定义可以存储在配置文件中,稍后更新。
到目前为止,这是我的代码:
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.
我无法使用clear_mappers,因为它擦除了所有类,而且这里的entity_name方案似乎不适用。
似乎每个对象都想使用同一个类,尽管它们都应该拥有自己的实例。
有没有人有任何想法?
答案 0 :(得分:1)
嗯,在您的情况下,* 与您尝试映射到不同Class
的{{1}}相同。要解决此问题,请为每个Table
动态创建一个类:
Table
但我更喜欢稍微清洁的版本:
class Table(object):
tableID = ''
primaryKey = ''
pkType = sa.types.String()
def __init__(self):
self.mappedClass = type('TempClass', (object,), {})