python - 如何从传递关系访问数据?

标签 python sqlalchemy

假设我在 SQLAlchemy 中定义了 3 个表:TaskJobLog,其中 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/

相关文章:

python - 当我使用 @observes 时, session 已经刷新

python - 使用 SQLAlchemy、SQLite 比较日期

python - 如何编写查询以从关系中获取 sqlalchemy 对象?

python - 为什么人们使用sqlalchemy CORE保存数据并使用sqlalchemy ORM查询数据

python - 用于语音到文本的 Python 语音处理库

python - 如何从可从 Python 使用的 C 或 C++ 代码创建 make .so 文件

Python 数据透视表/Groupby 文本列

Python3 SQLAlchemy 删除重复项

python - 扩展 matplotlib Line2D 类

python - 如何根据 Python 中另一个数据框的关系为变量赋值