I tienen el siguiente problema:sqlalchemy mapeo dinámico
tengo la clase:
class Word(object):
def __init__(self):
self.id = None
self.columns = {}
def __str__(self):
return "(%s, %s)" % (str(self.id), str(self.columns))
self.columns es un dict que llevará a cabo: valores (columnName columnValue). El nombre de las columnas son conocidos en tiempo de ejecución y se cargan en una lista wordColumns, por ejemplo
wordColumns = ['english', 'korean', 'romanian']
wordTable = Table('word', metadata,
Column('id', Integer, primary_key = True)
)
for columnName in wordColumns:
wordTable.append_column(Column(columnName, String(255), nullable = False))
incluso creé una explícitos propiedades Mapper para "forzar" las columnas de las tablas que se asignan en la palabra. columnas [columnName], en lugar de word.columnName, no aparece ningún error en la asignación, pero parece que no funciona.
mapperProperties = {}
for column in wordColumns:
mapperProperties['columns[\'%']' % column] = wordTable.columns[column]
mapper(Word, wordTable, mapperProperties)
Cuando cargo un objeto de palabra, SQLAlchemy crea un objeto que tiene las word.columns [ 'inglés'], word.columns [ 'coreano'] etc. propiedades en lugar de cargarlos en word.columns dict . Entonces, para cada columna, crea una nueva propiedad. Además, el diccionario word.columns ni siquiera existe.
De la misma manera, cuando trato de persistir una palabra, SQLAlchemy espera encontrar los valores de la columna en propiedades denominadas como word.columns [ 'Inglés'] (tipo de cadena) en lugar de los word.columns diccionario.
Tengo que decir que mi experiencia con Python y SQLAlchemy es bastante limitada, tal vez no sea posible hacer lo que estoy tratando de hacer.
Cualquier ayuda apreciada,
Gracias de antemano.
Gracias por tomarse el tiempo para escribir una respuesta tan completa. Estoy de acuerdo en que la primera solución es más limpia y más elegante que la segunda. No tenía ninguna buena razón para usar un dict excepto el hecho de que esto era lo "normal" que me vino a la mente. Como dije antes, soy bastante nuevo en Python y aún no he aprendido a aprovechar los beneficios de los lenguajes dinámicos. Usaré tu primera solución. Gracias de nuevo :) –
No puedo saber cuántas publicaciones como esta existen aquí, pero aún me asombra cuando veo una. Gracias por pensar tanto en esto. Sigue siendo útil, para gente nueva, más de un año después. Saludos a usted – Profane
Ahora, si quisiera usar kwargs para iniciar Word, como en w = Word (inglés = 'nombre', coreano = 'Phoo', rumano = 'nume'), ¿cómo funcionaría? En mi caso, seguirá arrojando un error __init__. ¡Gracias! – Julius