gpt4 book ai didi

python - SQLAlchemy 如何使用声明映射一对一关系的单列

转载 作者:太空狗 更新时间:2023-10-29 21:52:43 25 4
gpt4 key购买 nike

这与这个问题有关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)
)

但是,我似乎无法找到如何以声明方式执行此操作,也许这种方式不存在。有没有一种理智的方法可以实现这一目标而不必担心我的进口,甚至更糟的是我的类(class)顺序?由于我们有数百个表要映射,如果我们不得不担心类和导入顺序,我认为这将是一场维护噩梦。

如果所有这一切都完全不可能,一厢情愿,那么映射这些表的更好方法是什么?

最佳答案

这听起来像是 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')

这允许像 session.query(Marker).filter_by(marker_type='my_marker_type') 这样的查询

marker_type 字段是 MarkerType 对象上 name 字段的代理。该对象可以被 mt 字段(关系字段)引用

注意 uselist=False。这表示每个标记都有 1 种标记类型。该关系会自动检测外键并使用它。

关于python - SQLAlchemy 如何使用声明映射一对一关系的单列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com