Как прибавлять значение в базе данных SQL для бота aiogram?

Ссылка скопирована
1 ответ

У меня в боте люди могут кидать !Куб и если им не везет, то они получают мут, но я хочу чтобы это еще записывалось в БД. Я понял как сделать, чтобы записывало айди и тэг пользователей в БД, но не могу понять как сделать чтобы добавлялось +1 значение в ячейку. Надо как-то на мете loss и win в коде сделать +1 в таблицу, но я в программировании не смешарик.

#Переменные с привилегиями для мута и размута perms1 = ChatPermissions() perms2 = ChatPermissions(can_send_audios=True, can_add_web_page_previews=True, can_change_info=True, can_invite_users=True, can_manage_topics=True, can_pin_messages=True, can_send_documents=True, an_send_media_messages=True, can_send_messages=True, can_send_other_messages=True, can_send_photos=True, can_send_polls=True, can_send_video_notes=True, can_send_videos=True, can_send_voice_notes=True)  #ЛОГИН logging.basicConfig(level=logging.INFO)  #Сам бот bot = Bot(token = cfg.TOKEN2) dp = Dispatcher(bot)   conn = sqlite3.connect('db/database.db', check_same_thread=False) cursor = conn.cursor()  async def on_sturtup(_):      sqlite3.connect("new.db")      print("Подключён к БД")      print("Я тест базы данных")  #Создание таблицы cursor.execute("CREATE TABLE IF NOT EXISTS winka(user_id, username, win, loss)") conn.commit()   #Ввод данных в таблицы def db_table_val(user_id: int, username: str, win: int, loss: int): 	cursor.execute('INSERT INTO winka (user_id, username) VALUES (?, ?, ?, ?)', (user_id, username, win, loss)) 	conn.commit()  #Работа куба на число 1 kukb1 = ("!Куб 1", "!куб 1")  @dp.message_handler(Text (kukb1)) async def cub(message: types.Message):       kub = await bot.send_dice(message.chat.id)       kub = kub['dice']['value']       await sleep (4)       if 1 < kub:        loss= await message.reply(text=f"{message.from_user.first_name}nТы не угадал!nВыпало: {kub}nТеперь у тебя мут на 10 минут")        await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms1)        await sleep(600)        await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms2)       elif 1 > kub:         loss = await message.reply(text=f"{message.from_user.first_name}nТы не угадал!nВыпало: {kub}nТеперь у тебя мут на 10 минут")         await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms1)         await sleep(600)         await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms2)       else:         win = await message.reply(text=f"{message.from_user.first_name}nТЫ ПОБЕДИЛ!nВыпало: {kub}nТеперь у тебя мут на 10 минут")        us_id = message.from_user.id       username = message.from_user.username        db_table_val(user_id=us_id, username=username, win=win, loss=loss)       return cub   if __name__ == '__main__':   executor.start_polling(dp, on_startup = on_sturtup, skip_updates=True)

#Переменные с привилегиями для мута и размута perms1 = ChatPermissions() perms2 = ChatPermissions(can_send_audios=True, can_add_web_page_previews=True, can_change_info=True, can_invite_users=True, can_manage_topics=True, can_pin_messages=True, can_send_documents=True, an_send_media_messages=True, can_send_messages=True, can_send_other_messages=True, can_send_photos=True, can_send_polls=True, can_send_video_notes=True, can_send_videos=True, can_send_voice_notes=True) #ЛОГИН logging.basicConfig(level=logging.INFO) #Сам бот bot = Bot(token = cfg.TOKEN2) dp = Dispatcher(bot) conn = sqlite3.connect('db/database.db', check_same_thread=False) cursor = conn.cursor() async def on_sturtup(_): sqlite3.connect("new.db") print("Подключён к БД") print("Я тест базы данных") #Создание таблицы cursor.execute("CREATE TABLE IF NOT EXISTS winka(user_id, username, win, loss)") conn.commit() #Ввод данных в таблицы def db_table_val(user_id: int, username: str, win: int, loss: int): cursor.execute('INSERT INTO winka (user_id, username) VALUES (?, ?, ?, ?)', (user_id, username, win, loss)) conn.commit() #Работа куба на число 1 kukb1 = ("!Куб 1", "!куб 1") @dp.message_handler(Text (kukb1)) async def cub(message: types.Message): kub = await bot.send_dice(message.chat.id) kub = kub['dice']['value'] await sleep (4) if 1 < kub: loss= await message.reply(text=f"{message.from_user.first_name}nТы не угадал!nВыпало: {kub}nТеперь у тебя мут на 10 минут") await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms1) await sleep(600) await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms2) elif 1 > kub: loss = await message.reply(text=f"{message.from_user.first_name}nТы не угадал!nВыпало: {kub}nТеперь у тебя мут на 10 минут") await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms1) await sleep(600) await bot.restrict_chat_member(message.chat.id, message.from_user.id, perms2) else: win = await message.reply(text=f"{message.from_user.first_name}nТЫ ПОБЕДИЛ!nВыпало: {kub}nТеперь у тебя мут на 10 минут") us_id = message.from_user.id username = message.from_user.username db_table_val(user_id=us_id, username=username, win=win, loss=loss) return cub if __name__ == '__main__': executor.start_polling(dp, on_startup = on_sturtup, skip_updates=True)

Дополнительно:

cursor.execute('INSERT INTO winka (user_id, username) VALUES (?, ?, ?, ?)', (user_id, username, win, loss))

вот это выглядит странно. в 2 колонки вы пытаетесь вставить 4 переменные?

Надо как-то на мете loss и win в коде сделать +1 в таблицу

Зачем? Просто ставить user_id, user_name, result = 1,-1. 1 выиграл, -1 проиграл. Зачем умножать сущности?

1. Выбрать из базы запись по известному user_id.
2. Если получили запись, то выполнить обновление атрибута записи win = win + 1 где user_id этой записи равен известному user_id (то же самое в случае проигрыша loss = loss + 1).
3. Если не получили запись, то делаете вставку записи пользователя, с win = 0, loss = 0 (с 1 в нужной ситуации).

  • Я пытался написать как вы сказали, но не могу понять как получать запись user_id, писал через UPDATE, но каждый раз создаёт новые таблицы и не добавлят +1, можете помочь?
  • Я не знаю питонский, но на псевдокоде где-то так в мозгах видится/вертится:
    result = 'unknown' // результат пока неизвестен   if 1 < kub:      result = 'loss'  // проигрыш      ....      elif 1 > kub:        result = 'loss'  // проигрыш       ....       else:         result = 'win'  // выигрыш         ....         db_table_val(user_id=us_id, username=username, result=result)

    result = 'unknown' // результат пока неизвестен if 1 < kub: result = 'loss' // проигрыш .... elif 1 > kub: result = 'loss' // проигрыш .... else: result = 'win' // выигрыш .... db_table_val(user_id=us_id, username=username, result=result)

    Собственно, функция где-то так должна выглядеть:

    def db_table_val(user_id: int, username: str, result: str):     cursor.execute('select * from winka where user_id = ?', (user_id))         if получилось за-fetch-ить строку:         if result = 'win':            cursor.execute('update winka set win = win + 1 where user_id = ?', (user_id))            conn.commit()         elif result = 'loss':            cursor.execute('update winka set loss = loss + 1 where user_id = ?', (user_id))            conn.commit()    else // не удалось за-fetch-ить строку       if result = 'win':            cursor.execute('INSERT INTO winka (user_id, username, win, loss) VALUES (?, ?, 1, 0)', (user_id, username))            conn.commit()         elif result = 'loss':            cursor.execute('INSERT INTO winka (user_id, username, win, loss) VALUES (?, ?, 0, 1)', (user_id, username))            conn.commit()

    def db_table_val(user_id: int, username: str, result: str): cursor.execute('select * from winka where user_id = ?', (user_id)) if получилось за-fetch-ить строку: if result = 'win': cursor.execute('update winka set win = win + 1 where user_id = ?', (user_id)) conn.commit() elif result = 'loss': cursor.execute('update winka set loss = loss + 1 where user_id = ?', (user_id)) conn.commit() else // не удалось за-fetch-ить строку if result = 'win': cursor.execute('INSERT INTO winka (user_id, username, win, loss) VALUES (?, ?, 1, 0)', (user_id, username)) conn.commit() elif result = 'loss': cursor.execute('INSERT INTO winka (user_id, username, win, loss) VALUES (?, ?, 0, 1)', (user_id, username)) conn.commit()

Ответы:

Привет.

Заложи инкрементальный первичный ключ на стороне БД. Рекомендую привести запрос:

CREATE TABLE IF NOT EXISTS winka(user_id, username, win, loss)

CREATE TABLE IF NOT EXISTS winka(user_id, username, win, loss)

К виду:

CREATE TABLE IF NOT EXISTS winka(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id, username, win, loss)

CREATE TABLE IF NOT EXISTS winka(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id, username, win, loss)

Остальной код менять необходимости не вижу, вставлять можно так же.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Сергей Миронов Ответ

Для того чтобы прибавить значение в базе данных SQL для бота aiogram, вам необходимо выполнить следующие шаги:

1. Убедитесь, что у вас есть соединение с базой данных и таблица, в которой хранится значение, которое вы хотите увеличить.

2. Напишите SQL запрос, который будет увеличивать значение в указанной таблице. Для этого используйте оператор UPDATE и функцию для увеличения значения, например, INCREMENT.

3. В вашем коде Python, используя библиотеку aiogram, создайте функцию, которая будет выполнять SQL запрос к базе данных. Для этого воспользуйтесь модулем aiomysql для асинхронного выполнения запросов.

Пример кода на Python с использованием aiogram и aiomysql:

import aiomysql
import asyncio
 
async def increase_value_in_db():
    conn = await aiomysql.connect(host='хост_базы_данных', user='пользователь', password='пароль', db='название_базы_данных')
 
    async with conn.cursor() as cur:
        await cur.execute("UPDATE название_таблицы SET значение = значение + 1 WHERE условие")
 
    await conn.commit()
    conn.close()
 
loop = asyncio.get_event_loop()
loop.run_until_complete(increase_value_in_db())

import aiomysql import asyncio async def increase_value_in_db(): conn = await aiomysql.connect(host='хост_базы_данных', user='пользователь', password='пароль', db='название_базы_данных') async with conn.cursor() as cur: await cur.execute("UPDATE название_таблицы SET значение = значение + 1 WHERE условие") await conn.commit() conn.close() loop = asyncio.get_event_loop() loop.run_until_complete(increase_value_in_db())

Замените 'хост_базы_данных', 'пользователь', 'пароль', 'название_базы_данных', 'название_таблицы', 'значение' и 'условие' на соответствующие значения вашей базы данных и таблицы.

Таким образом, вы сможете прибавить значение в базе данных SQL для бота aiogram с помощью Python и асинхронной библиотеки aiomysql.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно