SQLAlchemy: динамическая загрузка таблиц из списка - PullRequest
1 голос
/ 29 сентября 2011

Я пытаюсь создать программу, которая загружает более 100 таблиц из базы данных, чтобы я мог изменить все появления идентификатора пользователя пользователя.

Вместо того чтобы отображать все таблицы по отдельности, я решил использовать цикл для отображения каждой из таблиц с использованием массива объектов. Таким образом, определения таблиц могут быть сохранены в файле конфигурации и позже обновлены.

Вот мой код:

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 Ответ

1 голос
/ 29 сентября 2011

Ну, в вашем случае это * - это то же самое Class, которое вы пытаетесь сопоставить с другими Table с. Чтобы решить эту проблему, создайте класс динамически для каждого 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...