tutorial remove query queries delete python sqlalchemy metaprogramming metaclass declarative

python - remove - Creación dinámica de clases en SQLAlchemy



sqlalchemy query (1)

Puede crear MyObject dinámicamente usando la llamada de 3 argumentos para type :

type(name, bases, dict) Return a new type object. This is essentially a dynamic form of the class statement...

Por ejemplo:

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}

Tenemos la necesidad de crear clases SQLAlchemy para acceder a múltiples fuentes de datos externas que aumentarán en número con el tiempo. Usamos la base declarativa para nuestros modelos de ORM principales y sé que podemos especificar manualmente las nuevas clases de ORM usando autoload = True para generar automáticamente la asignación.

El problema es que necesitamos poder generarlos dinámicamente tomando algo como esto:

from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() stored={} stored[''tablename'']=''my_internal_table_name'' stored[''objectname'']=''MyObject''

y convirtiéndolo en algo así dinámicamente:

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

No queremos que las clases persistan más tiempo del necesario para abrir una conexión, realizar consultas y luego cerrar la conexión. Por lo tanto, idealmente, podemos colocar los elementos en la variable "almacenada" de arriba en una base de datos y extraerlos según sea necesario. El otro desafío es que el nombre del objeto (por ejemplo, "MyObject") se puede usar en diferentes conexiones, por lo que no podemos definirlo una vez y mantenerlo.

Cualquier sugerencia sobre cómo esto podría lograrse sería muy apreciada.

Gracias...