Телеграм бот не заносит в базу данных новых пользователей

Рейтинг: 0Ответов: 1Опубликовано: 16.01.2023

Вот код самого бота

import random
import telebot
from dbWorker import *

bot = telebot.TeleBot('<TOKEN>')
prepareDb('db/database.db')

def rand():
    i = random.randint(1, 16)
    return i

@bot.message_handler(commands=['start'])
def start(message):
    init_user('db/database.db', message.from_user.first_name)
    bot.send_message(message.chat.id, 'Приветик любители выпить! Что желаете выпить?')
    bot.send_message(message.chat.id, 'Пиво - /drinkbeer \n'
                                      'Вино - /drinkwine \n'
                                      'Водка - /drinkvodka \n')


@bot.message_handler(commands=['drinkbeer'])
def drinkbeer(message):
    user_name = message.from_user.first_name
    currentLitres = getLitres('db/database.db', user_name, "beer")
    r = rand()
    s = currentLitres+r
    bot.send_message(message.chat.id, f'<em>{user_name}, вы выпили - {r} л пива.  </em>\n'
                                      f'Всего вы выпили - {s} л пива', parse_mode='html')
    setLitres('db/database.db', user_name, "beer", s)

@bot.message_handler(commands=['drinkwine'])
def drinkwine(message):
    user_name = message.from_user.first_name
    currentLitres = getLitres('db/database.db', user_name, "wine")
    r = rand()
    s = currentLitres + r
    bot.send_message(message.chat.id, f'<em>{user_name}, вы выпили - {r} л вина. \n'
                                      f'Всего вы выпили - {s} л вина </em>\n', parse_mode='html')
    setLitres('db/database.db', user_name, "wine", s)

@bot.message_handler(commands=['drinkvodka'])
def drinkvodka(message):
    user_name = message.from_user.first_name
    currentLitres = getLitres('db/database.db', user_name, "vodka")
    r = rand()
    s = currentLitres + r
    bot.send_message(message.chat.id, f'<em> {user_name}, вы выпили - {r} л водки. \n'
                                      f'Всего вы выпили - {s} л водки </em>\n', parse_mode='html')
    setLitres('db/database.db', user_name, "vodka", s)


bot.polling(none_stop=True)

Вот код файла

import sqlite3
from sqlite3 import Error

def init_conn(path):
    conn = None
    try:
        conn = sqlite3.connect(path)
        print ("Connection established!")
    except Error as e:
        print (e)
        print ("Connection failed!")
    return conn

def init_tables(connection):
    sql = "CREATE TABLE IF NOT EXISTS users( id integer PRIMARY KEY, user_name text NOT NULL, beer real NOT NULL, wine real NOT NULL, vodka real NOT NULL);"
    connection.execute(sql)

def prepareDb(name):
    conn = init_conn(name)
    init_tables(conn)
    conn.close()

def init_user(db, name):
    connection = init_conn(db)
    cursor = connection.cursor()
    users = cursor.fetchall()
    usersAmount = len(users)
    if usersAmount == 0:
        sql = "INSERT INTO users(`user_name`, `beer`, `wine`, `vodka`) VALUES('{}', 0, 0, 0);".format(name)
        cursor.execute(sql)
        connection.commit()
        connection.close()
    else:
        sql = "SELECT * FROM users WHERE `user_name`='" + name +"';"
        connection.set_trace_callback(print)
        cursor.execute(sql)



def setLitres(db, name, type, amount):
    sql = "UPDATE users SET `{}`={} WHERE `user_name`='{}';".format(type, amount, name)
    connection = init_conn(db)
    cursor = connection.cursor()
    cursor.execute(sql)
    connection.commit()
    connection.close()

def getLitres(db, name, type):
    sql = "SELECT {} FROM users WHERE `user_name`='{}';".format(type, name)
    connection = init_conn(db)
    cursor = connection.cursor()
    cursor.execute(sql)
    items = cursor.fetchall()
    litres = int(items[0][0])
    connection.commit()
    connection.close()
    return litres

Вот такая ошибка выдает, если команду использует человек которого нет в базе данных. Почему не хочет заносить? введите сюда описание изображения

Ответы

▲ 0
def init_user(db, name):
    connection = init_conn(db)
    cursor = connection.cursor()
    users = cursor.fetchall()
    usersAmount = len(users)
    if usersAmount == 0:

А где у вас тут собственно запрос, который проверяет наличие пользователя name в таблице users? У вас пропущена строка cursor.execute(sql) и сам запрос sql отсутствует.

Тут должно быть так же, как и в других функциях, где делаются запросы:

def init_user(db, name):
    sql = "..." # тут запрос на то, что запись для user = name есть в users
    connection = init_conn(db)
    cursor = connection.cursor()
    cursor.execute(sql) # тут вызов запроса
    users = cursor.fetchall()
    usersAmount = len(users)
    if usersAmount == 0: