2017-02-15 347 views
0

給定一組列名及其類型,目標是
實例化一個表和相應的映射類。sqlalchemy動態創建表和映射類

它與此處發佈的問題有關:Dynamic Class Creation in SQLAlchemy

到目前爲止,我有以下幾點:

table = Table(tbl, 
       metadata, 
      *(Column(col, ctype, primary_key=pk, index=idx) for col, ctype, pk, idx in zip(attrs, types, primary_keys, indexes)) 
      ) 

這將創建表對象。現在我需要創建相應的類。

mydict={'__tablename__':tbl} 
cls = type(cls_name, (Base,), mydict) 

這給了我以下錯誤:

ArgumentError: Mapper Mapper|persons_with_coord|t_persons_w_coord could not assemble any primary key columns for mapped table

我的問題是如何指定的主鍵作爲類創建的一部分。 並創建下課後,我需要調用映射如下:

mapper(cls, table) 

回答

0

mydict映射必須或者包括表對象或指定的表需要從數據庫加載。

這應該工作

mydict={'__tablename__':tbl, '__table__': table} 

這也應該工作

mydict={'__tablename__':tbl, '__table_args__': ({'autoload':True},)} 

主鍵已經被指定當您創建table。在創建聲明時,不需要再次指定它們,但是如果需要(例如,對於複雜的鍵),應該在__table_args__中指定它。

映射器必須在聲明類上調用。但是,新創建的聲明沒有元數據對象。添加元數據將使得動態創建聲明的行爲像一個普通的聲明,所以我建議把此行類創建後

cls.metadata = cls.__table__.metadata 

因此,全面的編輯可能是:

mydict={'__tablename__':tbl, '__table__': table} 
cls = type(cls_name, (Base,), mydict) 
cls.metadata = cls.__table__.metadata