【发布时间】:2020-06-02 14:40:39
【问题描述】:
我正在学习 Flask,我想创建一个数据库,其中包含 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)
你能建议我一种聪明而优雅的方式来实现我的目标吗?提前致谢。
【问题讨论】:
-
您可以在类中添加一个静态变量,该变量将是一个列表。每次调用构造函数时,您都可以在
__init__函数中执行类似COMPANIES.append(self)的操作。如果您想使用数据库,那么您应该执行Company.query.all()之类的操作,它将返回您数据库中所有公司的列表。 -
@geoph9 您好,感谢您的评论!请问您能建议使用第二种方法的回答吗?
-
通常的方法是根本不使用嵌套的for循环,而是让数据库产生你需要的数据:stackoverflow.com/questions/6044309/…。这在 SQL 中称为 JOIN,它通过组合 2 个表(在某些条件下)生成一个新表。然后,您可以再次加入新表,生成另一个表。当然,数据库系统实际上并没有真正做到这一点,但通常你不需要关心。
标签: python database flask sqlalchemy flask-sqlalchemy