2011-01-13 22 views
12

Mam plik csv z pierwszym wierszem jako pola i pozostałe wiersze jako dane. Z tym plikiem chciałbym utworzyć tabelę. Ponieważ pola są dość długie i mogą się różnić, chcę je dynamicznie tworzyć. Po kilku próbach i poszukiwaniach zorientowałem się, że mógłbym wygenerować klasę z fabryki, a następnie przypisać atrybuty do nowej klasy, by wygenerować dynamiczne kolumny. Ale zawiedzie. I w oparciu o błąd wypróbowałem kilka innych metod, wszystkie zawiodły. Proszę pomóż. Zastanawiam się, czy jest to możliwe do zrealizowania.jak dynamicznie tworzyć kolumny 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)) 

Błąd jest jak:

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

częściowo rozwiązany po znalezieniu tego http://stackoverflow.com/questions/2574105/sqlalchemy-dynamic-mapping – Nicolas

Odpowiedz

12

Jestem autorem powiązanego odpowiedź:

sqlalchemy dynamic mapping

mam to odpowiedź na inne pytanie, co moim zdaniem jest jeszcze bardziej powiązane - może to być nawet duplikat:

Database on the fly with scripting languages

Jak widać, aby to zrobić, należy utworzyć obiekt tabeli i odwzorować go na swoją klasę. Ponadto zmapowane klasy w sqlalchemy wymagają klucza podstawowego w tabeli, więc musisz go dodać. Czy masz jeszcze inny problem? Jeśli tak, czy możesz wkleić swój zaktualizowany kod?

+0

Dziękuję za odpowiedź. Tak, to demo jest dokładnie tym, czego bym szukał. – Nicolas

Powiązane problemy