Функция не сохраняет в базу данных изменения (sqlite3) в colab Python в проекте Flask
Писал проект изначально в Visual Studio 2019. После тестирования и полной работоспособности, решил продемонстрировать его знакомым, но я так с ngrok не разобрался и кроме меня на сайт зайти никто не смог, тогда решил перенести свой проект в colab там с ngrok проблем у меня не было. После переноса начал тестировать сайт и понял что функция отвечающая за получения данных и commit() не работает, точнее она работает на половину, Одна функция вытаскивает данные при обращении, но вторая функция которая загружает туда данные почему то не работает, я пробовал написать отдельную функцию для commit() но это тоже не произвело никакого результата. Ошибки не выдаёт.
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(DATABASE)
return db
# Функция - запрос в БД. В случае необходимости, может закомитить информацию
def query_db(query, args=(), one=False, commit=False):
cur = get_db().execute(query, args)
rv = cur.fetchall()
cur.close()
if commit:
get_db().commit()
return (rv[0] if rv else None) if one else rv
# Создаёт короткую ссылку, пытается вставить в БД, при возникновении ошибки,
# вызванной повторным ключом, перезапускается
def generate_short_link(long_link):
while True:
try:
short_link = "".join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for x in
range(random.randrange(5, 8)))
query_db('INSERT INTO links(local_addres,real_addres) VALUES (?, ?)', args=(short_link, long_link),
commit=True)
return short_link
except:
pass
Ответы (2 шт):
Вы закрываете объект до того как делаете commit:
cur = get_db().execute(query, args)
rv = cur.fetchall()
cur.close()
if commit:
get_db().commit()
А следует сначала делать commit и только потом закрывать объект:
cur = get_db().execute(query, args)
rv = cur.fetchall()
if commit:
get_db().commit()
cur.close()
И еще момент, все же commit необходимо выносить в отдельную функцию, так как там своя логика работы. Одно действие - одна функция.
Мне все же удалось решить проблему, проблема была в get_db() Было
def get_db():
db_path = "/content/gdrive/MyDrive/db/database.db"
db = sqlite3.connect(db_path) #('database.db')
db.row_factory = sqlite3.Row
return db
Стало
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect("/content/gdrive/MyDrive/db/database.db")
return db