Я пытаюсь создать программу, которая загружает более 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 здесь не применима.
Кажется, что каждый объект хочет использовать один и тот же класс, хотя у всех должен быть свой экземпляр этого класса.
У кого-нибудь есть идеи?