Правильно выполнять запросы, когда они не возвращают строки - PullRequest
0 голосов
/ 06 ноября 2019

Доброе утро!

У меня есть небольшой скрипт, который пытается выполнить операцию вставки в таблицу postgres.

Моя программа, которая отвечает за установление соединений с базой данных, выглядит следующим образом:

def conecta_server(lista, names):

    PUERTO      = 5432
    success     = False
    retries     = 0
    max_retries = 10

    while not success and retries < max_retries:

        try:
            with SSHTunnelForwarder((REMOTE_SERVER, 22),
                                ssh_username             = "user",
                                ssh_pkey                 = ssh_pkey,
                                ssh_private_key_password = "",
                                remote_bind_address      = ('127.0.0.1', PUERTO),
                                local_bind_address       = ('', PUERTO)) as tunnel:

                engine = sqlalchemy.create_engine("postgresql+psycopg2://{user}:{passw}@{host}:{port}/{db}".format(
                        user  = 'user',
                        passw = 'pass',
                        host  = tunnel.local_bind_host,
                        port  = tunnel.local_bind_port,
                        db    = 'db'))

                with engine.connect() as conn:
                        dic_df = {name: pd.DataFrame(conn.execute(query).fetchall(), columns = conn.execute(query).keys()) for (query, name) in zip(lista, names)}

            return dic_df

        except Exception as e:
            print('Error al intentarlo...')
            print(e)

        retries += 1

Обычно я использую этот код для операций выбора, но, как я уже сказал, теперь мне нужно сделать вставку.

При этом возникает следующая ошибка:

*** sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.

Странно то, что запрос действительно выполняется без проблем, но когда возникает исключение, сценарий не покидает какое-то время и выполняется 10 раз.

Есть ли способ избежатьЭта проблема? Я не знаю, можно ли установить соединение с помощью метода, отличного от fetchall (), предварительно выбрав его на основе результата теста conn.execute (query) .returns_rows.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 06 ноября 2019

Я не уверен, почему вы повторяете свое соединение так много раз. Если у вас часто возникают проблемы с подключением к вашей базе данных, вы должны действительно разобраться в этой проблеме.

Вы не должны удивляться, что она пробует десять раз - это именно то, что делает ваш код. Он попытается повторить любое исключение, что не очень хорошая практика. Вам следует сузить этот обработчик исключений.

Если вам не понадобится реструктурировать то, что у вас есть, вы можете обойти свою проблему, добавив в свою вставку предложение RETURNING. Это вернет данные (которые вам, вероятно, не нужны), но fetchall не выдаст исключение. Это не идеальное решение, но оно должно исправлять ошибки, по крайней мере, до запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...