Как правильно реализовать менеджер контекста в psycopg2?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно реализовать менеджер контекста в psycopg2?

Сообщение Anonymous »

Я рефакторил свой код psycopg2 с использованием функций, раньше все это было в блоке try-кроме-finally, однако я не совсем уверен, как реализовать контекстный менеджер для обработки соединения и курсора. Мои SQL-запросы работают и выглядят следующим образом:

Код: Выделить всё

def random_query(schema, table, username, number_of_files):
random_query = sql.SQL("SELECT * FROM {schema}.{table} WHERE username = {username} ORDER BY RANDOM() LIMIT {limit}").format(
schema=sql.Identifier(schema),
table=sql.Identifier(table),
username=sql.Literal(username),
limit=sql.Literal(number_of_files)
)
cursor.execute(random_query)
return cursor.fetchone()

def insert_query(schema, table, values):
insert_query = sql.SQL("INSERT INTO {schema}.{table}(shortcode, username, filename, extension) VALUES ({shortcode}, {username}, {filename}, {extension})").format(
schema=sql.Identifier(schema),
table=sql.Identifier(table),
shortcode=sql.Literal(values[0]),
username=sql.Literal(values[1]),
filename=sql.Literal(values[2]),
extension=sql.Literal(values[3])
)
cursor.execute(insert_query)
conn.commit()
  • Первая версия:

Код: Выделить всё

@contextmanager
def get_connection():
connection = psycopg2.connect(**DB_CONNECTION)
try:
yield connection
except Exception as err:
connection.rollback()
print('Error: ', err)
raise
finally:
if (connection):
connection.close()
print("Connection is closed.")

@contextmanager
def get_cursor(connection):
cursor = connection.cursor()
try:
yield cursor
finally:
cursor.close()

with get_connection() as conn, get_cursor(conn) as cursor:
random_record = random_query('test_schema', 'test_table', 'username', 1)
insert_query('test_schema', 'test_table2', random_record)
  • Вторая версия:

Код: Выделить всё

@contextmanager
def sql_connection():
connection = psycopg2.connect(**DB_CONNECTION)
cursor = connection.cursor()
try:
yield connection,cursor
except Exception as err:
connection.rollback()
print('Error : ', err)
raise
finally:
if (connection):
cursor.close()
connection.close()
print("Connection is closed")

with sql_connection() as (conn, cursor):
random_record = random_query('test_schema', 'test_table', 'username', 1)
insert_query('test_schema', 'test_table2', random_record)

Мои вопросы:
  • Есть ли разница между первой и второй версией? Какой из них предпочтительнее?
  • Как вы можете видеть в Insert_query, есть строка, которая вызывает conn.commit() Из документации я понимаю, что это не требуется, если мы используем менеджер контекста. Могу ли я их удалить?
Изменено в версии 2.5: если соединение используется в операторе with,
метод вызывается автоматически, если в блоке
with не возникает исключение.


Подробнее здесь: https://stackoverflow.com/questions/733 ... n-psycopg2
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»