我有一组我使用一个Python元类的动态映射数据库表(Postgres的9.3在PostGIS)的:
cls = type(str(tablename), (db.Model,), {'__tablename__':tablename})
其中,db.Model是经由烧瓶-SQLAlchemy的和表名的分贝对象是一个位Unicode的。 CLS的然后被添加到应用宽字典current_app.class_references
(使用瓶的CURRENT_APP),以避免企图类多次实例化。
每个表都包含一个几何列, wkb_geometry
存储所熟知的二进制文件。 我要地图这些使用geoalchemy2与检索GeoJSON的最终目标。
如果我宣布表是先验的,我会用:
class GeoPoly():
__tablename__ = 'somename'
wkb_geometry = db.Column(Geometry("POLYGON"))
#more columns...
因为我想要动态地做到这一点,我需要能够覆盖的反射cls1
与已知的类型。
尝试:
定义列明确,使用反射覆盖语法。
cls = type(str(tablename), (db.Model,), {'__tablename__':tablename, 'wkb_geometry':db.Column(Geometry("POLYGON"))})
返回上一个新的启动下,即类没有被实例化:InvalidRequestError:表“表名”已是该元数据实例定义。 指定“extend_existing = TRUE”重新定义现有的表对象上的选项和列
使用混入有上述(SANS 表名 )中定义的类:
cls = type(str(tablename), (GeoPoly, db.Model), {'__tablename__':tablename})
同样元数据的问题。
覆盖列定义属性的类实例化后:
cls = type(str(tablename), (db.Model,), {'__tablename__':tablename}) current_app.class_references[tablename] = cls cls.wkb_geometry = db.Column(Geometry("POLYGON"))
这会导致:
InvalidRequestError:隐柱tablename.wkb_geometry与列tablename.wkb_geometry下属性“wkb_geometry”相结合。 请配置这些明确同名列一个或多个属性。
是否可以使用元数据结构支持动态反射**和*覆盖知将可在所有表列?