Вечное хранение данных, а не на время работы кода (в 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 шт):
Так как у вас сейчас сделано, 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-ов, чтобы были импорты, потом функции, потом основной код - так понятнее ход выполнения кода.