kev*_*one 7 python orm sqlalchemy flask-sqlalchemy
这与转换为声明性方法和列属性的问题有关,这一问题从未得到解答.
我们正在尝试在现有模式(我们无法更改)上设置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())
Run Code Online (Sandbox Code Playgroud)
我们想要访问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)
)
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法以声明的方式找到如何做到这一点,也许这种方式不存在.是否有一种理智的方式,我可以实现这一点,而不必担心我的进口,甚至更糟糕的课程顺序?由于我们有数百个表要映射,如果我们不得不担心类和导入顺序,我会发现这是一个维护噩梦.
如果所有这一切都完全不可能,一厢情愿,那么映射这些表的更好方法是什么?
这听起来像是Association Proxy的绝佳用例。这代表了相关模型的一个字段。在这种情况下,实现将是:
from sqlalchemy.orm import relationship
from sqlalchemy.ext.associationproxy import association_proxy
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, ForeignKey('mrk_types._marker_type_key')
mt = relationship(MarkerType, uselist=False)
marker_type = association_proxy('mt', 'name')
Run Code Online (Sandbox Code Playgroud)
这允许查询 session.query(Marker).filter_by(marker_type='my_marker_type')
该marker_type字段是nameMarkerType 对象上的字段的代理。该对象可以被mt字段(关系字段)引用
请注意uselist=False. 这表示每个 Marker 有 1 种标记类型。该关系会自动检测 ForeignKey 并使用它。
| 归档时间: |
|
| 查看次数: |
2197 次 |
| 最近记录: |