问题描述
我是 Flask sqlAlchemy 的新手,我有一些关于如何将不同的数据库链接在一起以形成查询的问题。
我有 3 个数据库:用户、家庭作业、问题,其中 1 个用户可以有很多作业,1 个家庭作业可以有很多问题。我为 3 个类制作了 3 个单独的 .py 文件,每个文件都调用简单的函数,如 query.all() 和一些简单的过滤。
我以前学过 MysqL,我想知道如何创建与以下查询等效的 sqlAlchemy:
SELECT * FROM user,homework,questions
WHERE user.user_id = homework.user_id
AND homework.homework_id = questions.homework_id
我的问题是如何实现这一目标?我是创建一个新文件并找到将这些数据库绑定在一起的方法还是有更优化的方法?
另外,我该如何检索聚合函数值?例如,每个家庭作业的平均分数。
User.py
class User(db.Model):
__tablename__ = 'user'
user_id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(20),nullable=False)
Homework.py
class Homework(db.Model):
__tablename__ = 'homework'
homework_id = db.Column(db.Integer,autoincrement=True)
user_id= db.Column(db.Integer,nullable=False)
subject = db.Column(db.String(20),nullable=False)
Question.py
class Question(db.Model):
__tablename__ = 'question'
question_id = db.Column(db.Integer,autoincrement=True)
homework_id = db.Column(db.Integer,nullable=False)
marks = db.Column(db.Integer,nullable=False)
解决方法
您可以使用以下方法在表之间创建关系
class User(db.Model):
__tablename__ = 'user'
user_id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(20),nullable=False)
class Homework(db.Model):
__tablename__ = 'homework'
homework_id = db.Column(db.Integer,autoincrement=True)
user_id = db.Column(db.Integer,db.ForeignKey('user.user_id'),nullable=False)
subject = db.Column(db.String(20),nullable=False)
class Question(db.Model):
__tablename__ = 'question'
question_id = db.Column(db.Integer,autoincrement=True)
homework_id = db.Column(db.Integer,db.ForeignKey('homework.homework_id'),nullable=False)
marks = db.Column(db.Integer,nullable=False)
然后您可以使用以下命令访问给定表中的信息 插入您想要的 user_id 替换 xxx
user_object = User.query.filter_by(user_id=xxx).first()
username = user_object.username
user_id_value = user_object.user_id
homework_object = Homework.query.filter_by(user_id=user_id_value).first()
subject = homework_object.subject
homework_id_value = homework_object.homework_id
question_object = Question.query.filter_by(homework_id=homework_id_value).first()
marks = question_object.marks