首页 > 解决方案 > psycopg2 和无限 python 脚本

问题描述

我有一个用 Python 编写的无限脚本,它连接到 Postgresql,并在此人出现在连接到我计算机的摄像头前时插入一条记录。

我想知道连接(和存储连接)到数据库的最佳方式是什么,如果每次有人出现时都需要连接和关闭,或者我是否可以以某种方式存储连接。因为当我在无限循环之前创建连接并且相机前没有活动时,连接保持空闲,并且当脚本想要在一段时间后插入新行时,连接关闭。当我每次要插入新行时都连接,没有问题,但这比较慢。

感谢您的任何建议。

标签: pythonpostgresqlpsycopg2

解决方案


连接池适用于这种事情。我没有在生产中使用它(主要使用 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)

希望有帮助。


推荐阅读