这与这个问题有关,这个问题一直没有得到回答。在
我们试图在一个现有的模式(一个我们不能改变的模式)上建立一个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==“东西”。我唯一可以管理的方法是在Marker类中使用column\u属性,如下所示:
^{pr2}$然而,我似乎找不到如何用声明的方式来做这件事,也许这种方式并不存在。有没有一种明智的方法可以让我不必担心我的输入,或者更糟的是我的类的顺序?因为我们有数百个表要映射,所以如果我们不得不担心类和导入顺序,我可以看到这是一个维护噩梦。在
如果所有这些都是完全不可能的,一厢情愿的想法,那么有什么更好的方法来映射这些表呢?在
这听起来是Association Proxy的一个很好的用例。这将代理相关模型的字段。在这种情况下,实施将是:
这允许查询类似
session.query(Marker).filter_by(marker_type='my_marker_type')
marker_type
字段是MarkerType对象上name
字段的代理。该对象可以被mt
字段(关系字段)引用注意
uselist=False
。这表示每个标记有一个标记类型。关系会自动检测到外键并使用它。在所以据我所知,你被困在两张桌子上。一个是整数列,一个是字符串列
另一个有一个
^{pr2}$正如我所读到的,您希望类标记具有许多可以轻松操作或调用的类标记类型字符串。不过,我不确定这是否是你想要的。在
如果是这样,那么假设您控制了数据库的种子设定,就可以实现这一点。可以在每个名称的开头构建一个指向标记主键的标志。在
示例:MarkerType.name=10324_橙色
我不熟悉在没有sessions的情况下使用SQLAlchemy,也不太想做研究,所以我只想写下我的答案,假设你使用的是SQLAlchemy sessions,这样你就可以了解这个概念并根据需要进行调整。在
从这里可以向名称字符串添加其他标志。比如属性类型。在
这个附加的标志可以让您搜索链接到特定行的常规属性特定名称,它的可用性大大提高,尽管稍微复杂一些。实际上取决于你的用例。在
使用^{} 允许从
Marker
表访问marker_type
,并指定一个ForeignKey
约束,以便SQLAlchemy理解表之间的关系。在这允许您从标记记录轻松访问MarkerType属性,并对
MarkerType.name
进行查询。下面显示插入两条记录,然后根据属性name
进行过滤。在类的声明顺序并不重要,类需要一起声明。不过,架构必须针对
db
的同一实例注册,当您查询表时,需要导入您引用的表类。在将
^{pr2}$relationship
和ForeignKey
添加到标记后,声明性模式将变为:相关问题 更多 >
编程相关推荐