Как правильно закрыть связь в psyopcg2 с «заявлением»? - PullRequest
2 голосов
/ 25 марта 2019

Я хочу знать, как правильно закрыть соединение с базой данных Postgres с помощью операторов и psyopcg2.

import pandas as pd
import psycopg2
def create_df_from_postgres(params: dict,
                                   columns: str,
                                   tablename: str,
                                   ) -> pd.DataFrame:

    with psycopg2.connect(**params) as conn:
        data_sql = pd.read_sql_query(
          "SELECT " + columns + ", SUM(total)"
          " AS total FROM " + str(tablename),
          con=conn
          )
    # i need to close conection here:
        # conn.close()

    # or here:
    conn.close()
    return data_sql

Это лучший способ обработки соединения?

def get_ci_method_and_date(params: dict,
                           columns: str,
                           tablename: str,
                           ) -> pd.DataFrame:

    try:
        connection = psycopg2.connect(**params)
        data_sql = pd.read_sql_query('SELECT ' + columns +
                                     ' FROM ' + str(tablename),
                                     con=connection
                                     )
    finally:
        if(connection):
            connection.close()
    return data_sql

Из официальных документов psycopg

Предупреждение В отличие от файловых объектов или других ресурсов, выход из соединения с блоком не закрывает соединение, а только связанную транзакциюк этому.Если вы хотите убедиться, что соединение закрыто после определенного момента, вы все равно должны использовать блок try-catch:

conn = psycopg2.connect(DSN)
try:
    # connection usage
finally:
    conn.close()

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Правильный способ закрыть соединение:

Из официальных документов psycopg :

Предупреждение В отличие от файловых объектов или других ресурсов, выход из соединения с помощью block не закрывает соединение, а только транзакцию, связанную с Это. Если вы хотите убедиться, что соединение закрыто после определенного момента, вы все равно следует использовать блок try-catch:

conn = psycopg2.connect(DSN)
try:
    # connection usage
finally:
    conn.close()
0 голосов
/ 25 марта 2019

Смысл оператора with в том, что ресурсы очищаются автоматически при выходе.Таким образом, нет необходимости вообще вызывать conn.close().

...