【发布时间】:2014-10-28 16:25:58
【问题描述】:
这与这个问题converting to declarative method and column property有关,一直没有回答。
我们正在尝试在现有模式(我们无法更改的模式)上建立一个 Flask-SQLAlchemy 项目,并确定了声明性语法,以便我们可以以一种理智的方式将类组织到多个文件中以进行维护。这适用于我们的大多数关系,除了我们称之为属性表的东西,因为没有更好的术语。这些是一些主要对象的一对一叶表,通常包含某种属性的受控词汇表。 ORM 的目标是映射所有这些(其中有很多)类型的表,就好像它们是主表的属性一样。
这是一个包含两个表的 SQA 示例:
class MarkerType(db.Model):
__tablename__="mrk_types"
_marker_type_key = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String())
class Marker(db.Model):
__tablename__="mrk_marker"
_marker_key=db.Column(db.Integer,primary_key=True)
_marker_type_key=db.Column(db.Integer())
我们想要访问 MarkerType.name,就好像我们在说 Marker.markertype,或者在查询中作为 Marker.markertype=='thing'。我可以管理的唯一方法是在 Marker 类中使用 column_property,如下所示:
markertype = db.column_property(
db.select([MarkerType.name]).
where(MarkerType._marker_type_key==_marker_type_key)
)
但是,我似乎无法找到如何以声明方式执行此操作,并且可能不存在这种方式。有没有一种理智的方法可以实现这一点,而不必担心我的进口,甚至更糟的是我的课程顺序?由于我们有数百个表要映射,如果我们不得不担心类和导入顺序,我可以看到这是一个维护噩梦。
如果这一切完全不可能,一厢情愿,那么映射这些表的更好方法是什么?
【问题讨论】:
-
你看过
Vertical Attribute Mapping的例子吗? -
不,但我不确定我的情况是否适用。我没有带有键值对的子表。这是一个只有一个值的子表。我不确定这是否仍被视为垂直表。此外,设置 association_proxy 的示例看起来不是声明性的。
标签: python orm sqlalchemy flask-sqlalchemy