首页 > 解决方案 > 如何使用 SQLAlchemy 遍历关系表?

问题描述

我正在学习 Flask,我想创建一个数据库,其中包含 3 个表,它们之间是相关的:

  1. 公司:关于我工作的公司的信息(编造:))
  2. 工作:关于我在每家公司担任的角色的信息
  3. 任务:有关我在每家公司的每项工作中的任务的信息。

这是代码:

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///work_experience.db'
db = SQLAlchemy(app)

class Company(db.Model):
    id   = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    start_date = db.Column(db.DateTime, nullable=False)
    end_date   =  db.Column(db.DateTime, nullable=False, default=None)
    location   = db.Column(db.String(20), nullable=False, default='N/A')
    jobs = db.relationship('Job', backref='company_')

class Job(db.Model):
    id   = db.Column(db.Integer, primary_key=True)
    position = db.Column(db.String(100), nullable=False)
    start_date = db.Column(db.DateTime, nullable=False)
    end_date   =  db.Column(db.DateTime, nullable=False)
    company_id = db.Column(db.Integer, db.ForeignKey('company.id'))
    tasks = db.relationship('Task', backref='job_')

class Task(db.Model):
    id   = db.Column(db.Integer, primary_key=True)
    description = db.Column(db.String(100), nullable=False)
    start_date = db.Column(db.DateTime, nullable=False)
    end_date   =  db.Column(db.DateTime, nullable=False)
    job_id = db.Column(db.Integer, db.ForeignKey('job.id'))

db.create_all()

我的想法是有一个 for 循环(最终我会用 Jinja2 编写,但现在 python 代码很好),这样我就可以为每家公司打印我的工作和完成的任务。当然,我可以将所有数据放在一张表中,但我正在努力学习。

因此输出应该是这样的:

for company in Companies:
    for job in Jobs:
        for Task in Tasks:
            print(company, job, task)

你能建议我一种聪明而优雅的方式来实现我的目标吗?提前致谢。

标签: pythondatabaseflasksqlalchemyflask-sqlalchemy

解决方案


如果我理解正确,您需要一份所有公司、工作、任务的列表。您可以通过查询数据库来获取这些信息(假设您已经插入了一些元组):

for c in Company.query.all():
    print(c.name)
    for r in c.roles:
        print('\t',r.position)
        for t in r.tasks:
            print('\t\t',t.description)

推荐阅读