Skip to content

Commit 9928d05

Browse files
upgrade db adapter 2
1 parent bda10c1 commit 9928d05

File tree

2 files changed

+72
-48
lines changed

2 files changed

+72
-48
lines changed

example/db_adapter.py

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from datetime import datetime
22

33
import sqlalchemy
4-
from sqlalchemy import select, update
4+
from sqlalchemy import select, update, delete
5+
from sqlalchemy.sql.expression import func
56
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
67

7-
# from handlers import custom_types
8+
89

910
USERNAME = 'umschooluser'
1011
PASSWORD = 'umschoolpswd'
@@ -110,91 +111,121 @@ def delete_question_by_id_db(question_id: int, session: Session):
110111
удалить вопрос, варианты ответа,
111112
а также всю статистику связанную с ним из бд
112113
"""
113-
pass
114+
with session.begin():
115+
stmt = delete(Question).where(Question.id == question_id)
116+
session.execute(stmt)
117+
stmt = delete(Choice).where(Choice.question_id == question_id)
118+
session.execute(stmt)
119+
stmt = delete(UserStat).where(UserStat.question_id == question_id)
120+
session.execute(stmt)
121+
session.commit()
114122

115123

116124
@decorator_add_session
117125
def get_all_stat(session: Session) -> list[list]:
118126
"""
119127
получить статистику пользователей
120128
"""
121-
return [[]]
129+
stmt = (
130+
select(Question.question_text, Choice.choice_text, Choice.votes)
131+
.select_from(UserStat)
132+
.join(Choice, UserStat.choice_id == Choice.id)
133+
.join(Question, Choice.question_id == Question.id)
134+
)
135+
result = session.execute(stmt)
136+
out = []
137+
for row in result:
138+
out.append(row)
139+
return out
122140

123141

124142
@decorator_add_session
125143
def get_personal_stat(telegram_id: int, session: Session) -> list[list]:
126144
"""
127145
получить личную статистику пользователя
128146
"""
129-
return [[]]
147+
stmt = (
148+
select(Question.question_text, Choice.choice_text)
149+
.select_from(UserStat)
150+
.where(UserStat.tg_user_id == telegram_id)
151+
.join(Choice, UserStat.choice_id == Choice.id)
152+
.join(Question, Choice.question_id == Question.id)
153+
)
154+
result = session.execute(stmt)
155+
out = []
156+
for row in result:
157+
out.append(row)
158+
return out
130159

131160

132161
@decorator_add_session
133-
def get_random_question(telegram_id: int, session: Session):
162+
def get_random_question(telegram_id: int, session: Session) -> Question:
134163
"""
135164
получить случайный, неотвеченный вопрос из бд
136165
137166
return: tuple
138167
"""
139-
available_ids = set()
140-
answered_ids = set()
141-
text = ""
142-
id_ = -1
143-
with session.begin():
144-
stmt = select(Question.id).where(1==1)
145-
for id_ in session.scalars(stmt):
146-
available_ids.add(id_)
147-
stmt = select(UserStat).where(UserStat.tg_user_id == telegram_id)
148-
for id_ in session.scalars(stmt):
149-
answered_ids.add(id_)
150-
id_ = list(available_ids - answered_ids)[0]
151-
stmt = select(Question.question_text).where(Question.id == id_)
152-
for txt in session.scalars(stmt):
153-
text = txt
154-
return (id_, text)
168+
stmt = (
169+
select(Question.id, Question.question_text)
170+
.select_from(Question)
171+
.where(
172+
Question.id.notin_(
173+
select(UserStat.question_id)
174+
.where(UserStat.tg_user_id == telegram_id)
175+
.where(UserStat.question_id == Question.id)
176+
)
177+
)
178+
.order_by(func.random())
179+
.limit(1)
180+
)
181+
182+
question = session.execute(stmt).first()
183+
if question is None:
184+
return (-1, "")
185+
186+
return (question.id, question.question_text)
155187

156188

157189
@decorator_add_session
158190
def get_choices_by_question_id(question_id: int, session: Session) -> list[str]:
159191
"""
160192
получить ответы по заданному question_id
161193
"""
162-
choice_text = []
163-
with session.begin():
164-
stmt = select(Choice).where(Choice.question_id == question_id)
165-
for choice in session.scalars(stmt):
166-
choice_text.append(choice.choice_text)
167-
return choice_text
194+
return [
195+
(choice.id, choice.choice_text)
196+
for choice in session.scalars(
197+
select(Choice.id, Choice.choice_text)
198+
.where(Choice.question_id == question_id)
199+
.order_by(Choice.id)
200+
)
201+
]
168202

169203

170204
@decorator_add_session
171-
def add_user_vote_db(choice_id: int, telegram_id: int, session: Session):
205+
def add_user_vote_db(question_id: int, choice_id: int, telegram_id: int, session: Session):
172206
"""
173207
добавить голос пользователя выбранному варианту ответа
174208
"""
175209
with session.begin():
176-
stmt = select(Choice).where(Choice.id == choice_id)
177-
result = session.execute(stmt)
178-
votes = 0
179-
for choice in result.scalars():
180-
print(choice)
181-
votes = choice.votes
182-
183-
new_votes = votes + 1
184210
stmt = (
185211
update(Choice).
186212
where(Choice.id == choice_id).
187-
values(votes=new_votes)
213+
values(votes=Choice.votes+1)
188214
)
189-
print(stmt, new_votes, choice_id)
190215
session.execute(stmt)
216+
217+
user_stat = UserStat(question_id=question_id, choice_id=choice_id, tg_user_id=telegram_id)
218+
session.add(user_stat)
191219
session.commit()
192220

193221

194222

195223
if __name__ == "__main__":
196-
print(get_random_question(1))
197-
print(get_choices_by_question_id(1))
224+
# print(get_all_stat())
225+
# print(get_personal_stat(369937974))
226+
print(get_random_question(369937974))
227+
# print(get_choices_by_question_id(1))
198228
# create_tables_in_db()
199229
# add_question_to_db("test-question", datetime.now())
200230
# add_choice_to_db("test-choice", 20)
231+
# add_user_vote_db(3, 369937974)

example/handlers/custom_types.py

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)