使用 API 在 sqlalchemy 中访问关系 Table 数据
Accessing Relationship Table data in sqlalchemy with API
我在我的 postgres 数据库中定义了以下关联 table。
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'))
并且我想将这些非外键添加到 table 以便我可以访问特定学生参加的特定测试的分数。
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
编辑:事后思考
或者将分数包含在测试数据库模型中会更有意义吗?但是由于每个学生在每次测试中都有一个独特的分数,这对我来说没有多大意义。
我会做的是删除列 [MathNC_Score、MathC_Score、Reading_Score 等..] 并使用 subject列,然后将分数放在单独的 "score" 列中。这样你就可以
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 your int / float
"with_only_columns" 方法会删除结果中所有未列为参数的列,因此在对分数求和时无需循环并在循环中手动排除它们
---- 编辑
如果你想序列化查询的结果,你可以把所有的东西都变成字符串,然后 return。 (不是很复杂的方法,但很简单)
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
我在我的 postgres 数据库中定义了以下关联 table。
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'))
并且我想将这些非外键添加到 table 以便我可以访问特定学生参加的特定测试的分数。
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
编辑:事后思考 或者将分数包含在测试数据库模型中会更有意义吗?但是由于每个学生在每次测试中都有一个独特的分数,这对我来说没有多大意义。
我会做的是删除列 [MathNC_Score、MathC_Score、Reading_Score 等..] 并使用 subject列,然后将分数放在单独的 "score" 列中。这样你就可以
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 your int / float
"with_only_columns" 方法会删除结果中所有未列为参数的列,因此在对分数求和时无需循环并在循环中手动排除它们
---- 编辑
如果你想序列化查询的结果,你可以把所有的东西都变成字符串,然后 return。 (不是很复杂的方法,但很简单)
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