Я написал тот же проект, используя Django и Flask. Весь код доступен на моем аккаунте Github. Этот веб-сайт представляет собой небольшой веб-сайт с вопросами и ответами (в формате CTF с очень простыми вопросами) Вот ссылки:
Мой Вопрос касается оптимизации запросов ORM в SQLAlchemy или Flask -SQLAlchemy.
Я постараюсь написать схему таблиц так, как я могу, для лучшего понимания.
Teams (id, team_name, email, phone, password)
Questions (id, name, body, hint, answer, points, visible)
Submissions (id, team(fk), question(fk), timestamp)
Если кто-то из вас захочет увидеть действительный код, вот они:
Для Django - Вопрос и ответ , Команда
Для Flask - Вопрос , Команда , Отправка
Для двух маршрутов /submissions
и /leaderboard
мне пришлось написать определенные запросы, используя ОРМ. Вот как выглядят страницы:
Для Django запросы выглядят довольно хорошо (или, по крайней мере, я так думаю: P)
def submissions(request):
all_submissions = Question.objects \
.values('id', 'name') \
.order_by('id') \
.annotate(submissions=Count('submission'))
print(all_submissions.query)
return render(request, 'questions/submissions.html', {
'submissions': all_submissions
})
def leaderboard(request):
team_scores = Team.objects \
.values('team_name') \
.order_by('team_name') \
.annotate(score=Coalesce(Sum('submission__question__points'), 0)) \
.order_by('-score')
print(team_scores.query)
return render(request, 'questions/leaderboard.html', {
'team_scores': team_scores,
})
И необработанные SQL запросы выглядят так:
SELECT "teams_team"."team_name", COALESCE(SUM("questions_question"."points"), 0) AS "score" FROM "teams_team" LEFT OUTER JOIN "questions_submission" ON ("teams_team"."id" = "questions_submission"."team_id") LEFT OUTER JOIN "questions_question" ON ("questions_submission"."question_id" = "questions_question"."id") GROUP BY "teams_team"."team_name" ORDER BY "score" DESC
SELECT "questions_question"."id", "questions_question"."name", COUNT("questions_submission"."id") AS "submissions" FROM "questions_question" LEFT OUTER JOIN "questions_submission" ON ("questions_question"."id" = "questions_submission"."question_id") GROUP BY "questions_question"."id", "questions_question"."name" ORDER BY "questions_question"."id" ASC
Это было очень длинное введение в мой вопрос.
Мой вопрос начинается здесь я не могу написать этот или аналогичные запросы с использованием SQLAlchemy ORM, а PyCharm не предоставляет правильное завершение кода / предложения для того же.
Для Flask, вот как выглядят мои функции например:
def get_team_score(team):
team_submissions = Submission.query.filter_by(team_id=team.id)
score = sum(
submission.question.points
for submission in team_submissions
)
return score
@question_blueprint.route('/submissions')
def submissions():
all_submissions = [
{
'id': q.id,
'name': q.name,
'submissions': Submission.query.filter_by(question_id=q.id).count()
}
for q in Question.get() # fetch all Question rows
]
return render_template('submissions.html', **{
'submissions': all_submissions
})
@question_blueprint.route('/leaderboard')
def leaderboard():
team_scores = [
{
'team_name': team.team_name,
'score': get_team_score(team)
}
for team in Team.query.filter_by()
]
return render_template('leaderboard.html', **{
'team_scores': team_scores
})
Запросы не оптимизированы, и я хотел бы знать, возможно ли написать элегантные запросы, такие как django -orm, без необходимости писать необработанные операторы SQL. И, если возможно, я хотел бы получить несколько оптимизированных запросов для этих двух маршрутов, упомянутых в этом вопросе.
Фу.