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表达式,这与当前的情况不同。如果您需要这样的功能,可以尝试查看第二个链接。使用普通属性时,您需要在表中创建列,但随后需要不断更新该列。