Sqlalchemy 动态创建 table 并映射 class

Sqlalchemy dynamically create table and mapped class

给定一组列名及其类型,目标是
实例化一个 table 和对应的映射 class.

它与此处发布的问题有关: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))
              )

这将创建 table 对象。现在我需要创建相应的 class。

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

我的问题是如何在 class 创建过程中指定主键。 在创建 class 之后,我是否需要按如下方式调用映射器:

mapper(cls, table)

mydict 映射必须包含一个 table 对象或指定 table 需要从数据库加载。

这应该有效

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

这也应该有效

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

创建时已指定主键 table。在创建声明时不必再次指定它们,但是如果需要(例如,对于复杂的键),则应在 __table_args__.

中指定

必须在声明中调用映射器 class。但是,新创建的声明没有元数据对象。添加元数据将使动态创建的声明行为 more 像常规声明一样,因此我建议将此行放在 class 创建

之后
cls.metadata = cls.__table__.metadata

所以,完整的编辑可以是:

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