SQLAlchemy:从列表中动态加载表

时间:2011-09-29 12:34:13

标签: python dynamic sqlalchemy loading

我正在尝试创建一个从数据库加载超过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方案似乎不适用。

似乎每个对象都想使用同一个类,尽管它们都应该拥有自己的实例。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:1)

嗯,在您的情况下,* 与您尝试映射到不同Class的{​​{1}}相同。要解决此问题,请为每个Table动态创建一个类:

Table

但我更喜欢稍微清洁的版本:

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