1

我有以下Table代表时间线的模型。

class TimeRange(Base):


    __tablename__ = "time_line"


    record_id = Column(Integer, primary_key=True)
    level = Column(String, nullable=False) # e.g. "Point", "Range"
    content = Column(String, nullable=False)
    language_marker = Column(String) # this one column is optional and needs to be queried
    immediate_parent_id = Column(Integer, ForeignKey('time_line.record_id'))
    child_timelines = relationship('TimeRange', backref=backref('parent_timeline', remote_side=[record_id]))

language_markerColumn 是需要以递归方式查询的列。并不是所有的记录都有这样的属性,业务逻辑是:沿着从根到子时间线的层次谱系,至少有一级的TimeRange实例带有这样的属性,最底层的应该返回。这有点像级联样式表,如果TimeRange对象本身没有这样的属性,只需往上一层看,util 找到了一层,最后定义的样式获胜。

我应该研究什么技术方向来实现这样的查询?我正在使用 SQLAlchemy,后端是 SQLite。谢谢。

4

1 回答 1

1

我将添加一个属性derived_language_marker,该属性以当前对象开头,并在 parent s 的层次结构中上升,TimeRange直到找到一个不是的 language_markerNone并返回它:

 @property
 def derived_language_marker(self):
     time_range = self
     while not time_range.language_marker and time_range.parent_timeline:
         time_range = time_range.parent_timeline
     return time_range.language_marker

它可以像 一样访问time_range.derived_language_marker,但缺点是它可能会导致SELECT对每个级别进行新查询,它会检查父对象是否尚未加载。

(如果您为许多 s 执行此操作并且性能成为问题,您可以使用此处TimeRange描述的连接将祖先预加载到一定深度,只要最大可能深度不太极端。为了进一步优化,还有这种方法适用于 SQLite。)

于 2016-10-15T20:52:46.747 回答