Вечное хранение данных, а не на время работы кода (в sqlite). Как сделать?

Возможно вопрос глупый, но у меня возник (казалось бы).

Есть код. Есть sqlite. Я запускаю программу, создаются и сохраняются данные в таблицу sqlite, но лишь до остановки работы кода. Закрываю и снова запускаю, данные предыдущие не сохранены.

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

Вот код моей программы (бот для сообщества ВКонтакте).

import vk_api
import random
import time
import sqlite3
from base import *
import traceback

conn = sqlite3.connect('BotBase.db')
cur = conn.cursor()

def MessLog(id):
    print('The message has been sent to the '+ str(id) + 'id')

token = "туттокен"

vk = vk_api.VkApi(token=token)

vk._auth_token()

while True:
    try:
        messages = vk.method("messages.getConversations", {"offset": 0, "count": 20, "filter": "unanswered", "extended": 1})
        if messages["count"] >= 1:
            id = messages["items"][0]["last_message"]["from_id"]
            body = messages["items"][0]["last_message"]["text"]
            CheckBase(id)
            if body.lower() == "привет":
                vk.method("messages.send", {"peer_id": id, "message": "лимон", "random_id": random.randint(1, 2147483647)})
                MessLog(id)
            elif body.lower() == "кто я":
                vk.method("messages.send", {"peer_id": id, "message": "клоун", "random_id": random.randint(1, 2147483647)})
                MessLog(id)
            elif body.lower() == "profile":
                YourName = GetName(id)
                vk.method("messages.send", {"peer_id": id, "message": "сасиску кушаеш, " + str(YourName), "random_id": random.randint(1, 2147483647)})
                MessLog(id)
            elif body.lower() == "да или нет":
                rand = random.randint(1,2)
                if rand == 1 :
                    vk.method("messages.send", {"peer_id": id, "message": "DA", "random_id": random.randint(1, 2147483647)})
                else:
                    vk.method("messages.send", {"peer_id": id, "message": "NET", "random_id": random.randint(1, 2147483647)})
                MessLog(id)
            else:
                MessLog(id)
                vk.method("messages.send", {"peer_id": id, "message": "пук-пук  " + str(body.lower()), "random_id": random.randint(1, 2147483647)})
    except Exception as E:
        print(traceback.format_exc())
        time.sleep(1)

Вот же код base.py с самим sqlite:

import vk_api
import random
import time
import sqlite3

conn = sqlite3.connect('BotBase.db')
cur = conn.cursor()
print('Connected')

cur.execute("""CREATE TABLE IF NOT EXISTS users(userid INTEGER PRIMARY KEY, nickname TEXT, currency INT);""")

def SetToBase(userid, nickname, currency): 
    cur.execute(
        "INSERT INTO users(userid, nickname, currency) VALUES(?, ?, ?)",
        (userid, nickname, currency)
    )
    print('SetToBase complated')

def CheckBase(UserId):
    info = cur.execute('SELECT * FROM users WHERE userid = UserId')
    if info.fetchone() is None: 
        SetToBase(UserId, UserId, 100)
    print('CheckBase complated')

def GetName(UserId):
    info = cur.execute('SELECT nickname FROM users WHERE userid = UserId')
    info2 = cur.fetchone()
    print('GetName complated')
    return info2
conn.commit()

Ответы (1 шт):

Автор решения: CrazyElf

Так как у вас сейчас сделано, conn.commit() выполняется в самом начале работы. А нужно коммитить всегда после изменения данных, иначе они потом откатятся, так что нужно добавить коммит в функцию:

def SetToBase(userid, nickname, currency): 
    cur.execute(
        "INSERT INTO users(userid, nickname, currency) VALUES(?, ?, ?)",
        (userid, nickname, currency)
    )
    conn.commit() # <-- после внесения изменений
    print('SetToBase complated')

Да и после CREATE TABLE тоже нужен коммит, лучше эту строку conn.commit(), которая в самом конце кода у вас, перенести на сразу после создания таблицы. Фактически, она так и выполняется, но лучше группировать код по смыслу.

А определения функций лучше поставить сразу после import-ов, чтобы были импорты, потом функции, потом основной код - так понятнее ход выполнения кода.

→ Ссылка