Динамическое создание класса в SQLAlchemy

У нас есть потребность создать классы SQLAlchemy для доступа к нескольким внешним источникам данных, которые будут увеличиваться численно со временем. Мы используем декларативную основу для наших базовых моделей ORM, и я знаю, что мы можем вручную указать, что новые классы ORM с помощью autoload=True для автоматического генерируют отображение.

Проблема состоит в том, что мы должны смочь, генерируют их динамично взятие чего-то вроде этого:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

stored={}
stored['tablename']='my_internal_table_name'
stored['objectname']='MyObject'

и превращение его во что-то вроде этого динамично:

class MyObject(Base):
    __tablename__ = 'my_internal_table_name'
    __table_args__ = {'autoload':True}

Мы не хотим, чтобы классы сохранились дольше, чем необходимый, чтобы открыть соединение, выполнить запросы и затем закрытие соединения. Поэтому идеально мы можем поместить объекты в "сохраненную" переменную выше в базу данных и вытянуть их по мере необходимости. Другая проблема состоит в том, что имя объекта (например, "MyObject") может использоваться на различных соединениях, таким образом, мы не можем определить его однажды и иметь в наличии его.

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

Спасибо...

21
задан PlaidFan 4 May 2010 в 20:07
поделиться

1 ответ

Вы можете динамически создать MyObject, используя 3-аргументный вызов type:

type(name, bases, dict)

    Return a new type object. This is essentially a dynamic form of the 
    class statement... 

Например:

mydict={'__tablename__':stored['tablename'],
        '__table_args__':{'autoload':True},}

MyObj=type(stored['objectname'],(Base,),mydict)
print(MyObj)
# <class '__main__.MyObject'>
print(MyObj.__base__)
# <class '__main__.Base'>
print(MyObj.__tablename__)
# my_internal_table_name
print(MyObj.__table_args__)
# {'autoload': True}
29
ответ дан 29 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: