SQLAlchemy:如何查询自引用邻接列表表上的可选列?

SQLAlchemy:如何查询自引用邻接列表表上的可选列?,sqlalchemy,cascading,self-referencing-table,Sqlalchemy,Cascading,Self Referencing 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_ma

我有下面的
模型表示时间线

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\u marker
列是需要以递归方式查询的列。并非所有记录都有这样的属性,业务逻辑是:沿着从根到子时间线的层次结构沿袭,至少有一个
TimeRange
实例级别带有这样的属性,并且应该返回最低级别的属性。这有点像层叠样式表,如果
TimeRange
对象本身没有这样的属性,只需进一步查看上面的一个级别,util找到了一个,最新定义的样式就赢了


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

我将添加一个属性
派生的\u语言\u标记
,该属性从当前对象开始,在父级
时间范围
s的层次结构中向上移动,直到它找到一个非
的语言标记并返回它:

 @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\u range.derived\u language\u marker
一样访问,但缺点是它可能会导致对每个级别进行新的
SELECT
查询,以检查是否尚未加载父对象


(如果您在许多
时间范围内执行此操作,并且性能成为一个问题,您可以使用连接将祖先加载到某个深度,只要最大可能深度不太极端。为了进一步优化,还可以使用SQLite。)

无论何时
语言\u标记
,@xli,对父
时间范围
执行选择查询是否符合性能要求,谢谢您的回复。绝对没问题。现在我对这里的技术方向一无所知。你能提供更多的细节吗?再加上一点简洁和有用。我希望我能再增加一个优雅。你能再解释一下为什么在时间范围上使用属性而不是混合属性,甚至是普通属性吗?谢谢。
hybrid\u属性
允许您对
派生语言标记
进行查询(如
filter(派生语言标记==some\u值)
),但需要能够将逻辑转换为SQL表达式,这与当前的情况不同。如果您需要这样的功能,可以尝试查看第二个链接。使用普通属性时,您需要在表中创建列,但随后需要不断更新该列。