【问题标题】:Accessing Relationship Table data in sqlalchemy with API使用 API 访问 sqlalchemy 中的关系表数据
【发布时间】:2019-12-09 16:17:30
【问题描述】:

我在我的 postgres 数据库中定义了以下关联表。

student_tests_association_table =db.Table('student_tests',
                    db.Column('students_id', db.Integer, db.ForeignKey('students.id')),
                    db.Column('tests_id', db.Integer, db.ForeignKey('tests.id'))

我想将这些非外键添加到表中,以便我可以访问特定学生参加的特定测试的分数。

                    db.Column('MathNC_Score', db.Integer),
                    db.Column('MathC_Score', db.Integer),
                    db.Column('Reading_Score', db.Integer),
                    db.Column('Writing_Score', db.Integer))) 

如果我这样做了,我将如何访问上面的数据? 例如,如果我将一个函数定义为:

def get_score(subject):
        return student_tests_association_table.c.[subject]

它将访问整个列,所以如果我只想获得一个分数,即'MathC_Score',对于 test_id = 1,它会是什么样子?

另外,如果我想为一个测试添加所有分数,该函数是否看起来像......

 def get_total_score():
        for c in student_tests_association_table:
            if c.key == 'students_id' or 'tests_id':
                pass 
            else: 
                sum = sum + c 
            return sum

编辑:事后思考 或者将分数包含在测试数据库模型中是否更有意义?但是因为对于每个学生在每个测试中都有一个独特的分数,这对我来说没有多大意义。

【问题讨论】:

  • 我认为你的问题归结为查询语法,你用什么来连接数据库?您可以使用原始 sql 或数据库抽象层。你在用这样的东西吗?
  • 您是在构建数据库还是使用此查询进行访问?基于这个问题和现有代码,你有一个测试表,它有自己的 id 等,主题居住在哪里。如果是这种情况,您不应该将这些列添加到您的键表中,而是创建一个单独的表来获取访问权限。
  • 我正在使用 sqlalchemy 查询@c8999c3f964f64
  • @brddawg 学生要参加考试,我想存储考试科目的分数。我想我可以将这些列添加到已经关联的 student_tests 表中,以便与学生和所参加的测试对齐的其他列具有旁边列出的分数以供访问。我必须将分数字段添加到数据库模型吗?
  • 与 sqlalchemy 查询无关,如果您“规范化”youtube.com/watch?v=xoTyrdT9SZI 并删除学生和测试信息并将它们保存在单独的表中,您的数据库将更有效率。在这种情况下,您将有一个包含以下内容的表格:1.students_is & name,2.student_tests,因为您在问题中有它,3.test_id & test。在您的查询中,您会将学生加入到 student_tests 进行测试,输入一个学生 ID,也许还有一个主题,然后获取所有相关的测试。与您的编辑相关,您可以在当前结构中添加一个带有分数的列。

标签: python postgresql flask sqlalchemy flask-restful


【解决方案1】:

我要做的是删除列 [MathNC_Score、MathC_Score、Reading_Score 等] 并使用 subject 列,然后将分数放在单独的“分数”列中。这样你就可以

query = student_tests.select()\
    .with_only_colums(student_tests.c.score)\
    .where(student_test.c.students_id == X)\
    .where(student_test.c.subject == "MathNC")

获取该学生的所有 MathNC 考试成绩。否则,您最终会得到一堆空字段,并且必须努力检查哪一列实际上有值,而不是直接查询它。 subject 字段将包含一个字符串,而 score 您的 int / float

“with_only_columns”方法会删除结果中所有未作为参数列出的列,因此在汇总分数时无需循环并在循环中手动排除它们

---- 编辑

如果您想序列化查询结果,您可以将所有内容转换为字符串并返回。 (不是一个非常复杂的方法,但很简单)

my_session = Session(engine)
result = my_session.execute(query)
return_dict = dict() 
for row in result: 
    for key, value in row.items():
        return_dict.update({key: str(value)})
return return_dict

【讨论】:

  • 谢谢^^ 这很有帮助,但是如果我想以 API 方式访问它,如何使用 select 获取查询以输出 json 格式的分数数据?
  • 我会添加另一个答案,但您通常应该提出一个新问题而不是使用评论
  • 啊,好的,谢谢,还是新手。所以我会把上面的答案标记为正确的。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 2019-10-16
  • 2019-02-19
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多