Flask-SQLAlchemy 多数据库组成查询

问题描述

我是 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