Как прибавлять значение в базе данных SQL для бота aiogram?
У меня в боте люди могут кидать !Куб и если им не везет, то они получают мут, но я хочу чтобы это еще записывалось в БД. Я понял как сделать, чтобы записывало айди и тэг пользователей в БД, но не могу понять как сделать чтобы добавлялось +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)
Остальной код менять необходимости не вижу, вставлять можно так же.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы прибавить значение в базе данных 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())
Замените 'хост_базы_данных', 'пользователь', 'пароль', 'название_базы_данных', 'название_таблицы', 'значение' и 'условие' на соответствующие значения вашей базы данных и таблицы.
Таким образом, вы сможете прибавить значение в базе данных SQL для бота aiogram с помощью Python и асинхронной библиотеки aiomysql.