2011-01-13 19 views
12

Tengo un archivo csv con la primera línea como campos y líneas restantes como datos. Con este archivo me gustaría crear una tabla. Como los campos son bastante largos y pueden variar, quiero crearlos dinámicamente. Después de varios intentos y búsquedas, pensé que podría generar una clase de fábrica y luego asignar los atributos a la nueva clase podría generar columnas dinámicas. Pero falla. Y basado en el error, probé otros métodos, todos fallaron. Por favor ayuda. Estoy considerando si es factible para tal idea.cómo crear dinámicamente columnas SQLAlchemy

Reader = csv.reader(open('Book1.csv', 'rb'), delimiter=',', quotechar='|') 
TableItem = Reader.next()[0:] 
def Factory(*args, **kwargs): 
    args=args[0] 
    def init(self, *iargs, **ikwargs): 
     #setattr(self,__tablename__,ikwargs[__tablename__]) 
     for k,v in kwargs.items(): 
      setattr(self, k, v) 
     for i in range(len(iargs)): 
      setattr(self, args[i], iargs[i]) 
     for k,v in ikwargs.items(): 
      setattr(self, k, v) 

    name = kwargs.pop("name", "myFactory") 
    kwargs.update(dict((k, None) for k in args)) 
    return type(name, (object,), {'__init__': init}) 

LIS=Factory(TableItem) 
class newLIS(LIS,Base): 
    __tablename__='testonly' 
    pass 
mytest=[] 
for row in Reader: 
    mytest.append(newLIS(row)) 

El error es como:

sqlalchemy.exc.ArgumentError: Mapper Mapper|newLIS|testonly could not assemble 
any primary key columns for mapped table 'testonly' 
+0

parcialmente resuelto después de encontrar este http://stackoverflow.com/questions/2574105/sqlalchemy-dynamic-mapping – Nicolas

Respuesta

12

yo soy el autor de la respuesta relacionada:

sqlalchemy dynamic mapping

tengo esta respuesta a otra pregunta, que creo que es aún más relacionado, incluso podría ser un duplicado:

Database on the fly with scripting languages

Como puede ver, para hacerlo necesita crear un objeto de tabla y asignarlo a su clase. Además, las clases mapeadas en sqlalchemy necesitan una clave principal en la tabla, por lo que debe agregar una. ¿Estás teniendo otro problema además de eso? Si es así, ¿puedes pegar tu código actualizado?

+0

Gracias por su respuesta. Sí, esa demostración es exactamente lo que buscaría. – Nicolas

Cuestiones relacionadas