Skip to content

Commit 237b6e5

Browse files
upgrade db adapter 2
1 parent bda10c1 commit 237b6e5

File tree

4 files changed

+77
-53
lines changed

4 files changed

+77
-53
lines changed

example/db_adapter.py

Lines changed: 71 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
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
88

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

115122

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

123140

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

131159

132160
@decorator_add_session
133-
def get_random_question(telegram_id: int, session: Session):
161+
def get_random_question(telegram_id: int, session: Session) -> tuple:
134162
"""
135163
получить случайный, неотвеченный вопрос из бд
136164
137165
return: tuple
138166
"""
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)
167+
stmt = (
168+
select(Question.id, Question.question_text)
169+
.select_from(Question)
170+
.where(
171+
Question.id.notin_(
172+
select(UserStat.question_id)
173+
.where(UserStat.tg_user_id == telegram_id)
174+
.where(UserStat.question_id == Question.id)
175+
)
176+
)
177+
.order_by(func.random())
178+
.limit(1)
179+
)
180+
181+
question = session.execute(stmt).first()
182+
if question is None:
183+
return (-1, "")
184+
185+
return (question.id, question.question_text)
155186

156187

157188
@decorator_add_session
158189
def get_choices_by_question_id(question_id: int, session: Session) -> list[str]:
159190
"""
160191
получить ответы по заданному question_id
161192
"""
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
193+
return [
194+
(choice.id, choice.choice_text)
195+
for choice in session.scalars(
196+
select(Choice.id, Choice.choice_text)
197+
.where(Choice.question_id == question_id)
198+
.order_by(Choice.id)
199+
)
200+
]
168201

169202

170203
@decorator_add_session
171-
def add_user_vote_db(choice_id: int, telegram_id: int, session: Session):
204+
def add_user_vote_db(question_id: int, choice_id: int, telegram_id: int, session: Session):
172205
"""
173206
добавить голос пользователя выбранному варианту ответа
174207
"""
175208
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
184209
stmt = (
185210
update(Choice).
186211
where(Choice.id == choice_id).
187-
values(votes=new_votes)
212+
values(votes=Choice.votes+1)
188213
)
189-
print(stmt, new_votes, choice_id)
190214
session.execute(stmt)
191-
session.commit()
192215

216+
user_stat = UserStat(question_id=question_id, choice_id=choice_id, tg_user_id=telegram_id)
217+
session.add(user_stat)
218+
session.commit()
193219

194220

195221
if __name__ == "__main__":
196-
print(get_random_question(1))
197-
print(get_choices_by_question_id(1))
222+
# print(get_all_stat())
223+
# print(get_personal_stat(369937974))
224+
print(get_random_question(369937974))
225+
# print(get_choices_by_question_id(1))
198226
# create_tables_in_db()
199227
# add_question_to_db("test-question", datetime.now())
200228
# add_choice_to_db("test-choice", 20)
229+
# add_user_vote_db(3, 369937974)

example/handlers/custom_types.py

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

example/handlers/get_survey.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
add_user_vote_db,
99
)
1010

11+
1112
class AnswerQuestion(StatesGroup):
1213
waiting_answer = State()
1314

15+
1416
logger = telebot.logger
1517

18+
1619
def register_handlers(bot):
1720
@bot.message_handler(commands=['get_new_question'])
1821
def start_survey(message: telebot.types.Message):
@@ -23,13 +26,12 @@ def start_survey(message: telebot.types.Message):
2326
bot.send_message(message.from_user.id, question[1])
2427
bot.send_message(
2528
message.from_user.id,
26-
'Варианты ответа:\n'+ '\n'.join(choices),
29+
'Варианты ответа:\n' + '\n'.join(choices),
2730
)
2831

2932
@bot.message_handler(state=AnswerQuestion.waiting_answer)
3033
def process_user_answer(message: telebot.types.Message):
3134
print(message.text)
32-
user_answer = int(message.text) # посмотреть
35+
user_answer = int(message.text) # посмотреть
3336
add_user_vote_db(user_answer, message.from_user.id)
3437
bot.send_message(message.from_user.id, "Записал :)")
35-

example/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from init_bot import create_bot
99

1010

11-
# telebot.logger.setLevel(logging.DEBUG) # Outputs messages to console.
11+
telebot.logger.setLevel(logging.ERROR) # Outputs messages to console.
1212

1313
if __name__ == "__main__":
1414
create_tables_in_db()

0 commit comments

Comments
 (0)