2011-01-13 17 views
12

Ich habe eine CSV-Datei mit der ersten Zeile als Felder und verbleibenden Zeilen als Daten. Mit dieser Datei möchte ich eine Tabelle erstellen. Da die Felder ziemlich lang sind und variieren können, möchte ich sie dynamisch erstellen. Nach mehreren Versuchen und Suchen, ich dachte, ich könnte vielleicht eine Klasse von Fabrik generieren und dann zuweisen die Attribute der neuen Klasse könnte dynamische Spalten generieren. Aber es scheitert. Und basierend auf dem Fehler habe ich einige andere Methoden ausprobiert, die alle fehlgeschlagen sind. Bitte helfen Sie. Ich überlege, ob es für eine solche Idee machbar ist.wie dynamisch erstellt SQLAlchemy Spalten

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)) 

Der Fehler ist wie:

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

teilweise gelöst nach dem Finden dieser http://stackoverflow.com/questions/2574105/sqlalchemy-dynamic-mapping – Nicolas

Antwort

12

Ich bin der Autor der zugehörigen Antwort:

sqlalchemy dynamic mapping

Ich habe diese Antwort auf eine andere Frage, die ich denke, ist noch mehr verwandt - es könnte sogar ein Duplikat sein:

Database on the fly with scripting languages

Wie Sie sehen können, müssen Sie ein Tabellenobjekt erstellen und es Ihrer Klasse zuordnen. Außerdem benötigen zugeordnete Klassen in sqlalchemy einen Primärschlüssel für die Tabelle, sodass Sie einen hinzufügen müssen. Hast du sonst noch ein anderes Problem? Wenn ja, können Sie Ihren aktualisierten Code einfügen?

+0

Vielen Dank für Ihre Antwort. Ja, diese Demo ist genau das, wonach ich suchen würde. – Nicolas