【发布时间】:2014-11-21 16:37:50
【问题描述】:
我有一组动态数据库表(带有 PostGIS 的 Postgres 9.3),我正在使用 python 元类进行映射:
cls = type(str(tablename), (db.Model,), {'__tablename__':tablename})
其中,db.Model 是通过 flask-sqlalchemy 生成的 db 对象,而 tablename 有点 unicode。
然后将 cls 添加到应用程序范围的字典 current_app.class_references(使用 Flask 的 current_app)以避免尝试多次实例化该类。
每个表都包含一个几何列,wkb_geometry 存储在 Well Known Binary 中。我想将这些映射到使用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: 表 'tablename' 已为此 MetaData 实例定义。指定 'extend_existing=True' 以重新定义现有 Table 对象上的选项和列
-
对上面定义的类使用 mixins(无 tablename):
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:在属性“wkb_geometry”下将 tablename.wkb_geometry 列与 tablename.wkb_geometry 列隐式组合。请为这些同名列显式配置一个或多个属性。
是否可以使用元数据构造来支持动态反射**和* *覆盖一个已知列将在所有表上可用?
【问题讨论】:
标签: python-2.7 reflection sqlalchemy flask-sqlalchemy geoalchemy