Задать вопрос
@dada_arewnd

В чем проблема?

При получении перевода выдает ошибку
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
from random import randint
import sqlite3
import datetime
token = '***'
try:

    connection = sqlite3.connect("base.db", check_same_thread = False)
    cursor = connection.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS users (
        id INTEGER,
        cash INTEGER,
        date TEXT,
        prel TEXT
    )""")
    
except:

    print("Не удалось подключиться к базе данных!")


session = vk_api.VkApi(token = token)
vk = session.get_api()

def send(user_id, text):

    vk.messages.send(user_id = user_id, message = text, random_id = randint(-2147483648, +2147483648))

def sender(chat_id, text):

    vk.messages.send(chat_id = chat_id, message = text, random_id = randint(-2147483648, +2147483648))

def parc(text):

    if "ты получил" in text:

        try:

            index0 = text.find("[")
            index1 = text.find("|")
            id = int(text[index0 + 3:index1])        
            text = text[:index0].split(" ")

            for word in text:
                if "$" in word:
                    money = int(word[1:].translate(str.maketrans('', '', ".")))

            if cursor.execute(f"SELECT id FROM users WHERE id = {id}").fetchone() is None: 
                cursor.execute(f"INSERT INTO users VALUES ({id}, {money}, '{str(datetime.date.today())}')")

            else:
                cursor.execute(f"UPDATE users SET cash = cash + {money} WHERE id = {id}")
                cursor.execute(f"UPDATE users SET date = '{str(datetime.date.today())}' WHERE id = {id}")

            connection.commit()

        except Exception as ex:
            print(ex)

def count(user_id):

    if cursor.execute(f"SELECT id FROM users WHERE id = {user_id}").fetchone() is None:

        cursor.execute(f"INSERT INTO users VALUES ({user_id}, 0, '{str(datetime.date.today())}')")
        connection.commit()
        return 0

    else:

        time = cursor.execute(f"SELECT date FROM users WHERE id = {user_id}").fetchone()[0]
        connection.commit() 
        
        now = str(datetime.date.today())
        time = time.split('-')
        time = datetime.date(int(time[0]), int(time[1]), int(time[2]))
        now = datetime.date.today()
        itog = now - time
        itog = str(itog)

        try:

            itog = itog.split(" ")[0]
            itog = int(itog)
            
            if itog < 7: return 0
            elif itog >= 7 and itog < 14: return 30
            elif itog >= 14 and itog < 21: return 60
            elif itog >= 21 and itog < 28: return 90
            else: return 120
        except: return 0
print("QQ")
for event in VkLongPoll(session).listen():
    if event.type == VkEventType.MESSAGE_NEW and event.from_group:
        parc(event.text.lower())


Ошибка:
table users has 4 columns but 3 values were supplied
  • Вопрос задан
  • 120 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
Maksim_64
@Maksim_64
Data Analyst
когда вы создаете таблицу вот здесь
cursor.execute("""CREATE TABLE IF NOT EXISTS users (
        id INTEGER,
        cash INTEGER,
        date TEXT,
        prel TEXT
    )""")
вы создаете таблицу с 4 колонками.
Везде где вы вставляете в таблицу данные например
cursor.execute(f"INSERT INTO users VALUES ({id}, {money}, '{str(datetime.date.today())}')")
вы вставляет ряд с тремя переменными id, money и сегодняшнюю дату, а где четвертая переменная? которая при создании таблицы называется prel TEXT И такое не в одном месте, вместо 4 преременных ожидаемых базой вы предоставили только 3.
Ответ написан
Комментировать
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
насколько я понял, ошибка на этой строке
cursor.execute(f"INSERT INTO users VALUES ({id}, {money}, '{str(datetime.date.today())}')")

Ошибка гласит: таблица users имеет 4 колонки но было внесено 3 значения. - т.е. просит четвертое значение.

я не понял за что отвечает колонка prel, но походу в данном случае она не нужна.
Если не заполняешь значение, то ставь NULL, т.е. ничего.

cursor.execute(f"INSERT INTO users VALUES ({id}, {money}, '{str(datetime.date.today())}', NULL)")


или просто в запросе указать какие значения ты заносишь

cursor.execute(f"INSERT INTO users (`id`, `cash`, `date`) VALUES ({id}, {money}, '{str(datetime.date.today())}')")

тогда все остальные значения выставляться как NULL
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы