2011-01-13 12 views
12

Ho un file csv con la prima riga come campi e le righe rimanenti come dati. Con questo file vorrei creare un tavolo. Poiché i campi sono piuttosto lunghi e possono variare, voglio crearlo dinamicamente. Dopo diversi tentativi e ricerche, ho pensato che potrei forse generare una classe dalla fabbrica e quindi assegnare gli attributi alla nuova classe in grado di generare colonne dinamiche. Ma fallisce. E in base all'errore, ho provato altri metodi, tutti falliti. Per favore aiuto. Sto considerando se sia fattibile per un'idea del genere.come creare dinamicamente le colonne 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)) 

L'errore è simile:

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

parzialmente risolto dopo aver trovato questo http://stackoverflow.com/questions/2574105/sqlalchemy-dynamic-mapping – Nicolas

risposta

12

Sono l'autore della risposta relativa:

sqlalchemy dynamic mapping

ho questa risposta a un'altra domanda, che credo sia ancora più correlato - potrebbe anche essere un duplicato:

Database on the fly with scripting languages

Come si può vedere, per renderlo è necessario creare un oggetto tabella e mapparlo contro la classe. Inoltre, le classi mappate in sqlalchemy hanno bisogno di una chiave primaria sulla tabella, quindi devi aggiungerne una. Stai avendo qualche altro problema oltre a quello? In tal caso, puoi incollare il codice aggiornato?

+0

Grazie per la risposta. Sì, quella demo è esattamente ciò che cercherò. – Nicolas

Problemi correlati