psycopg2 и бесконечный скрипт на питоне - PullRequest
0 голосов
/ 25 мая 2018

У меня есть бесконечный скрипт, написанный на Python, который подключается к Postgresql и вставляет туда запись, когда перед камерой, подключенной к моему компьютеру, появляется человек.

Я хотел бы знать, как лучше всегоподключить (и сохранить подключение) к базе данных, если необходимо подключаться и закрываться каждый раз, когда появляется человек, или если я могу каким-либо образом сохранить подключение.Потому что, когда я создаю соединение перед бесконечным циклом, и перед камерой нет активности, соединение остается бездействующим, и когда через некоторое время сценарий хочет вставить новую строку, соединение закрывается.Когда я подключаюсь каждый раз, когда я хочу вставить новую строку, проблем нет, но это медленнее.

Спасибо за любые предложения.

1 Ответ

0 голосов
/ 27 мая 2018

Пул соединений хорошо работает для такого рода вещей.Я не работал с ним в производстве (используя в основном Django или SQLAlchemy), но psycopg2.pool включает в себя несколько разных реализаций (SimpleConnectionPool или PersistentConnectionPool), которые, вероятно, соответствуют вашим потребностям.Вообще говоря, пул не только помогает управлять соединениями как общим ресурсом, но также тестирует и повторно инициализирует соединение, когда это необходимо.

from psycopg2 import pool
conn_pool = pool.PersistentConnectionPool(minconn, maxconn, **dbopts)

def work_method():
    conn = conn_pool.getconn()
    with conn.cursor() as stmt:
        stmt.execute(sql)
    conn_pool.putconn(conn)

putconn чрезвычайно важен, так что исключение не покидает пул, думая, что соединение все еще используется.Было бы неплохо справиться с этим как с менеджером контекста:

import contextlib

@contextlib.contextmanager
def get_db_connection():
    conn = conn_pool.getconn()
    yield conn
    conn_pool.putconn(conn)

def work_method():
    with get_db_connection() as conn:
        with conn.cursor() as stmt:
            stmt.execute(sql)

Надеюсь, это поможет.

...