2011-01-13 91 views
12

我有一個csv文件,第一行爲字段,其餘行爲數據。有了這個文件,我想創建一個表。由於字段很長,可能會有所不同,我想動態創建它。 經過多次嘗試和搜索之後,我想我可以從工廠生成一個類,然後將這些屬性分配給新的類可以生成動態列。但它失敗了。根據錯誤,我嘗試了其他一些方法,都失敗了。請幫忙。我正在考慮這樣的想法是否可行。如何動態創建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)) 

的錯誤是這樣的:

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

發現此問題後部分解決http://stackoverflow.com/questions/2574105/sqlalchemy-dynamic-mapping – Nicolas 2011-01-13 09:08:25

回答

12

我相關答案作者:

sqlalchemy dynamic mapping

我有這樣的回答另一個問題時,我認爲這是甚至更相關 - 它甚至可能是重複的:

Database on the fly with scripting languages

正如你所看到的,爲了使它成爲你需要創建一個表格對象並將它映射到你的類中。此外,sqlalchemy中的映射類需要表上的主鍵,因此您必須添加一個主鍵。除此之外,你還有其他問題嗎?如果是這樣,你可以粘貼你的更新代碼?

+0

感謝您的回覆。是的,該演示正是我所要搜索的內容。 – Nicolas 2011-01-14 06:21:20