2017-02-15 93 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