mr_qpdb
@mr_qpdb
⏱ - is not eternal

Ошибка: connection already closed. В чем причина?

Доброго времени суток.
У меня есть говнокод, где я пытаюсь выполнить sql INSERT в таблицу.
Делаю я все это дерьмо через try->except->finally.
Вот код:
try:
    connection = None
    connection = conn
    cursor = connection.cursor()
    cursor.execute('SELECT user_id FROM users WHERE user_id = %s', [user.id])
    result_user_id = [x[0] for x in cursor.fetchall()]
    if user_id not in result_user_id:
        sql_insert = 'INSERT INTO users(user_id, first_name, last_name) VALUES(%s, %s, %s)'
        val = (user_id, first_name, last_name)
        cursor.execute(sql_insert, val)
        connection.commit()
    cursor.close()
except (Exception, psycopg2.Error) as error:
    print(error)
finally:
    if connection is not None:
        connection.close()

При первом выполнении скрипта - без ошибок, на второй раз ошибка: connection already closed.

Люди, которые оскорбляют и унижают: прошу не высирать свой гнев, а просто дать ответ, и укажите на мои ошибки, пожалуйста.
  • Вопрос задан
  • 5297 просмотров
Решения вопроса 1
mr_qpdb
@mr_qpdb Автор вопроса
⏱ - is not eternal
Решил проблему используя "with" вместо try->except->finally.
Даже, убрал cursor.close() потому, что "with" сам автоматически будет закрывать.
Код:
try:
    with conn.cursor() as cursor:
        cursor.execute('SELECT user_id FROM users WHERE user_id = %s', [user.id])
        result_user_id = [x[0] for x in cursor.fetchall()]
        if user_id not in result_user_id:
            sql_insert = 'INSERT INTO users(user_id, first_name, last_name) VALUES(%s, %s, %s)'
            val = (user_id, first_name, last_name)
            cursor.execute(sql_insert, val)
            conn.commit()
except (Exception, psycopg2.Error) as error:
    conn.rollback() # Чтобы откатить все изменения в случае ошибки
    print(error)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hottabxp
@hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Проблема в том, что вы собираетесь закрыть соединение, которое уже закрыто. Так как всего кода я не вижу, могу предложить так: connection.close() добавить после cursor.close(), a finally убрать. И скорее всего cursor перед connection.close() не обязательно закрывать(хотя, не уверен). И возможно первые 3 строчки в коде лишние в try.
Ответ написан
Ваш ответ на вопрос

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

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