@MrCute
Студент

Когда мне следует создавать и закрывать курсоры при работе в SQLite?

Приветствую всех.
Начал разбираться в принципах работы с БД Sqlite на Питоне. Перечитал много документации и примеров, но не могу понять такую вещь. Когда мне нужно создавать соединение с БД, создавать курсоры для SQL запросов, и когда нужно всё это закрывать?

Есть условно такой код (Бот в Телеграм):
connection = sqlite3.connect('users_db.sqlite', check_same_thread=False)
bot = telebot.TeleBot('bla-bla')

def create_database():

    cursor = connection.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS users(
                      t_id TEXT PRIMARY KEY NOT NULL,
                      username TEXT,
                      first_name TEXT,
                      last_name TEXT,
                      _group TEXT) WITHOUT ROWID""")

    connection.commit()
    cursor.close()


def get_user_group(user_id):
    cursor = connection.cursor()
    cursor.execute("""SELECT _group FROM users WHERE t_id=?""", (user_id,))
    connection.commit()
    user_group = cursor.fetchone()
    cursor.close()
    if not user_group:
        return False
    return user_group[0]


def add_or_update_user_to_db(chat, group):

    if not get_user_group(chat.id):

        cursor = connection.cursor()
        cursor.execute("""INSERT INTO users (t_id, username, first_name, last_name, _group) VALUES (?, ?, ?, ?, ?)""",
                       (chat.id, chat.username, chat.first_name, chat.last_name, group))
        connection.commit()
        cursor.close()

    else:
        cursor = connection.cursor()
        cursor.execute("""UPDATE users SET _group=? WHERE t_id=?""", (group, chat.id))
        connection.commit()
        cursor.close()

@bot.message_handler(content_types=["text"])
def main_menu(message):

    #  тут условно обработка сообщений

if __name__ == '__main__':

    create_database()

    bot.polling(none_stop=True, interval=2)  #  бесконечный цикл


Я создал "глобальное" соединение, и во время работы программы его использую, но оно нигде у меня не закрывается.
Так же при каждом обращении к БД создаю новый курсор, делаю запрос, и сразу курсор закрываю.

Есть ли смысл постоянно создавать новые курсоры, или можно создать его рядом с соединением? И правильно ли я сделал, создав одно соединение, которое никак не закрывается? В расчёте, что программа должна крутится всё время без перерывов.

Спасибо.
  • Вопрос задан
  • 1209 просмотров
Пригласить эксперта
Ответы на вопрос 1
Sly_tom_cat
@Sly_tom_cat
.
Курсоры лучше сразу закрывать как они перестали быть нужны и на сколько я помню с ними можно работатьв конструкции with (там закрытие автоматом).

Что то типа
with connection.cursor() as cursor:
     do_something_with(cursor)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы