假设我在 SQLAlchemy 中定义了 3 个表:Task
、Job
、Log
,其中 Task
定义了一些可以执行的任务类型,Job 定义了执行任务的具体值,Log 存储了每次执行的一些信息。所以每个日志都知道它的作业 ID,每个作业都知道它的任务 ID:
class Task(DeclarativeBase):
__tablename__ = 'task'
id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)
# ...
jobs = relationship("Job", backref="task")
class Job(DeclarativeBase):
__tablename__ = 'job'
id = Column(Integer, primary_key=True)
task_id = Column(Integer, ForeignKey("task.id"), nullable=False)
# ...
logs = relationship("Log", backref="job")
class Log(DeclarativeBase):
__tablename__ = 'name'
id = Column(Integer, primary_key=True)
job_id = Column(Integer, ForeignKey("job.id"), nullable=False)
# ...
在我们的 GUI 中,我们按顺序列出了所有Log
条目,以便我们的客户可以查看它们。但是我们现在需要过滤它们,并且我们想按任务名称过滤它们。我的天真的方法是我们的 LogDAO
class DAO(object):
def __init__(self, session, model):
""" :param session: The database session that is used for data access
:param model: The db model class
"""
self.session = session
self.model = model
class LogDAO(DAO):
def __init__(self, session):
super(LogDAO, self).__init__(session, Log)
# ...
def with_task_name(task_name):
self.session.query(self.model.job.task.name == task_name)
self.model.job
存在,但 self.model.job.task
不存在。是否有其他优雅的方式来按 Task
名称过滤 Log
条目?
最佳答案
找到了这个解决方案:
class LogDAO(DAO):
# ...
def with_task_name(task_name):
return self.session.query(Log)
.join(Log.job)
.join(Job.task)
.filter(Task.name == task_name)
关于python - 如何从传递关系访问数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51191122/