Не обновляются данные в sqlite3 по запросу execute('UPDATE')
Пытаюсь обновить информацию в базе данных sqlite3 через cur.execute('UPDATE...'), но ничего не получается. Вроде бы, сделал всё правильно, даже перед самим запуском cur.execute('UPDATE...') вывожу данные, но ноль реакции от базы данных, при этом ошибок никаких нет. Заранее спасибо за помощь!
Вот код: `
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import os
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import sqlite3 as sql
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
storage=MemoryStorage()
bot = Bot(token=os.getenv('TOKEN'))
dp = Dispatcher(bot, storage=storage)
######################################DATABASE##########################################
async def on_startup(_):
print('sucсessful start')
global base, cur
base = sql.connect('pizza_col.db')
cur = base.cursor()
if base:
print('data base successful start')
base.execute('CREATE TABLE IF NOT EXISTS menu(number PRIMARY KEY, img TEXT, name TEXT, info TEXT, price TEXT, valute TEXT)')
base.execute('CREATE TABLE IF NOT EXISTS survey(user_id TEXT PRIMARY KEY, first_name TEXT, username TEXT, result INTEGER)')
base.commit()
async def sql_menu(message):
for ret in cur.execute('SELECT * FROM menu').fetchall():
await bot.send_photo(message.from_user.id, ret[1], f'{ret[2]}\nОписание: {ret[3]}\nЦена: {ret[4]} {ret[-1]}')
async def spl_read():
return cur.execute('SELECT * FROM menu').fetchall()
async def sql_replace_command(data):
print(data)
cur.execute(f'UPDATE menu SET {data[0]} == ? WHERE {data[1]} == ?', (data[2], data[3]))
base.commit()
######################################CLIENT############################################
@dp.message_handler(commands=['start', 'help'])
async def commands_start(message : types.Message):
try:
await bot.send_message(message.from_user.id, 'Пиццерия "ВКУСНО И НИЧЕГО" приветствует вас\nПриятного аппетита :)', reply_markup=key_client)
await message.delete()
except:
await message.reply('Общение с ботом в ЛС, напишите ему: \nhttps://t.me/Pizza_inventor_bot\n\n\nP.s.Бот не виноват, что не может вам написать, такие правила Телеграма :(')
@dp.message_handler(commands=['Меню'])
async def command_menu(message : types.Message):
try:
await sql_menu(message)
except:
await message.reply('Введите команду /start или /help')
#######################################ADMIN############################################
ID = None
names = ['Фото', 'Название', 'Описание', 'Цена', 'Валюта']
names_2 = ['img', 'name', 'info', 'price', 'valute']
class FSMadmin(StatesGroup):
photo = State()
name = State()
info = State()
price = State()
valute = State()
class FSMadmin_replace(StatesGroup):
replace_data = State()
@dp.message_handler(commands=['admin_up'], is_chat_admin=True)
async def make_change_command(message: types.Message):
global ID
ID = message.from_user.id
await bot.send_message(message.from_user.id, 'Welcom admin!', reply_markup=key_admin)
await message.delete()
##########REPLACE##########
@dp.callback_query_handler(lambda y: y.data and y.data.startswith('replace '))
async def replace_callback_run(callback: types.CallbackQuery, state: FSMContext):
await FSMadmin_replace.replace_data.set()
async with state.proxy() as data_2:
for ret_data in range(2):
data_2[f'data_0_{ret_data}'] = callback.data.replace('replace ', '').split(' ')[ret_data]
await callback.message.answer('Внесите изменения')
await callback.answer()
@dp.message_handler(state=FSMadmin_replace.replace_data)
@dp.message_handler(content_types=['photo'], state=FSMadmin_replace.replace_data)
async def replace_data(message: types.Message, state: FSMContext):
if message.from_user.id == ID:
async with state.proxy() as data_2:
if data_2['data_0_1'] == 'img':
data_2_loc = message.photo[0].file_id
else:
data_2_loc = message.text
await sql_replace_command([data_2['data_0_1'], 'number', data_2_loc, data_2['data_0_0']])
await state.finish()
@dp.message_handler(commands=['Изменить'])
async def replace_items(message: types.Message):
def list_keyboard(ret):
return [InlineKeyboardButton(text=names[i], callback_data=f'replace {ret[0]} {names_2[i]}') for i in range(5)]
if message.from_user.id == ID:
read = await spl_read()
for ret in read:
await bot.send_photo(message.from_user.id, ret[1], f'{ret[2]}\nОписание: {ret[3]}\nЦена: {ret[4]} {ret[-1]}')
e = list_keyboard(ret)
await bot.send_message(message.from_user.id, text='^^^Изменить^^^', reply_markup=InlineKeyboardMarkup(row_width=5).row(e[0], e[1], e[2], e[3], e[-1]))
########BUTTON########
but_4 = KeyboardButton('/Меню')
but_replace = KeyboardButton('/Изменить')
key_client = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
key_client.add(but_4)
key_admin = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).row(but_replace)
executor.start_polling(dp, skip_updates=True, on_startup=on_startup)
`
Примечание: код сокращал, так как был очень большой
Ответы (1 шт):
Понял ошибку! Дело в том что, при внесении информации в таблицу тип данных в столбце number был int (в коде выше не видно, так как сокращённая часть), а поиск в таблице производился через тип данных str (async def replace_callback_run, в цикле for присваивалось число как строка), из-за этого ничего не происходило.
Казалось бы, чем отличается '5' от 5, особенно когда много информации, даже внимание не обращаешь, но для машины это очень важно!