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 = ?

всем спасибо за помощь!

→ Ссылка