fetchone возвращает NoneType (не смог нигде найти решение)
в файле db.py:
import sqlite3
import os
class Database:
def __init__(self, db_file):
current_dir = os.path.dirname(os.path.abspath(__file__))
self.db_file = os.path.join(current_dir, db_file)
self.connection = sqlite3.connect(self.db_file)
self.cursor = self.connection.cursor()
self.cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER UNIQUE NOT NULL,
referer_id INTEGER,
rewards INTEGER DEFAULT 0,
referals INTEGER DEFAULT 0
)
""")
self.connection.commit()
def user_exists(self, user_id):
with self.connection:
result = self.cursor.execute("SELECT * FROM 'users' WHERE 'user_id' = ?", (user_id,)).fetchall()
return bool(len(result))
def add_user(self, user_id, referer_id=None):
with self.connection:
if referer_id != None:
return self.cursor.execute("INSERT INTO 'users' ('user_id', 'referer_id') VALUES (?,?)", (user_id, referer_id,)).fetchone()
else:
return self.cursor.execute("INSERT INTO 'users' ('user_id') VALUES (?)", (user_id,)).fetchone()
def get_rewards(self, user_id):
with self.connection:
sql = "SELECT 'rewards' FROM 'users' WHERE 'user_id' = ?"
print(f"Запрос: {sql}, Аргумент:{user_id}")
result = self.cursor.execute(sql, (user_id,)).fetchone()
print(result)
print(user_id)
if result is not None:
return result
else:
return 0
def add_rewards(self, user_id, amount):
with self.connection:
current_rewards = self.get_rewards(user_id)
self.cursor.execute(
"UPDATE 'users' SET 'rewards' = ? WHERE 'user_id' = ?",
(current_rewards + amount, user_id))
self.connection.commit()
и в другом файле я его применяю:
from asyncio import sleep
from aiogram import Router, F
from aiogram.types import Message
from handlers.db import Database
import os
router = Router()
curretn_path = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(curretn_path, 'database.db')
db = Database(db_path)
@router.message(F.text == 'Бросок')
async def command_start(message: Message):
data = await message.answer_dice(emoji='?')
await sleep(3.5)
if data.dice.value == 6:
db.add_rewards(message.from_user.id, 10)
await message.answer("Хороший бросок! Вам начислено 10 монет.")
else:
await message.answer("Хорошая попытка! Попробуйте ещё раз")
в консоли принтами я получаю:
Запрос: SELECT 'rewards' FROM 'users' WHERE 'user_id' = ?, Аргумент:628072647
None
628072647
Везде пишут о проверке на наличие результата, что в моем коде есть, но как быть, если fetchone всегда возвращает None? все 3 файла я положил в одну папку, что бы не было ошибок с путями
Ответы (1 шт):
Автор решения: Amir
→ Ссылка
Нашел свою ошибку в sql запросах, вместо:
SELECT 'rewards' FROM 'users' WHERE 'user_id' = ?
UPDATE 'users' SET 'rewards' = ? WHERE 'user_id' = ?
необходимо было писать без обертывания названий столбцов в ''
, т.е.:
SELECT rewards FROM users WHERE user_id = ?
UPDATE users SET rewards = ? WHERE user_id = ?
всем спасибо за помощь!