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
给定一组列名及其类型,目标是
实例化一个 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