python psycopg2 连接pg 建立连接池
# -*- coding: utf-8 -*-
from psycopg2.pool import ThreadedConnectionPool,SimpleConnectionPool,PersistentConnectionPool
from constant import pg_name, pg_user, pg_pw, pg_host, pg_port
from public import gen_sql
# pgpool = ThreadedConnectionPool(1, 5, dbname=pg_name, user=pg_user, host=pg_host, password=pg_pw, port=pg_port)
# pgpool = SimpleConnectionPool(1, 5, dbname=pg_name, user=pg_user, host=pg_host, password=pg_pw, port=pg_port)
pgpool = PersistentConnectionPool(1, 100, dbname=pg_name, user=pg_user, host=pg_host, password=pg_pw, port=pg_port)
# 不管是哪种方式建立的连接池, 多进程或者多线程都会导致数据cursor 关闭, 出错等数据库问题, 即使是在每个进程中都建立连接池也不行(我的测试结果, 水平有限)
def conn_exe(*sp):
conn = pgpool.getconn() # 获取连接
cursor = conn.cursor() # 获取cursor
cursor.execute(*sp)
conn.commit() # 没次操作都要提交
pgpool.putconn(conn) # 放回连接, 防止其他程序pg无连接可用
return cursor
def fetchone_sql(*sp):
cursor = conn_exe(*sp)
# desc = cursor.description # cursor 的具体描述信息
fetchone = cursor.fetchone()
cursor.close()
return fetchone
def fetchall_sql(*sp):
cursor = conn_exe(*sp)
fetchall = cursor.fetchall()
cursor.close()
return fetchall
def get_insert_id(*sp):
*sp += " returning id" # 插入语句这样返回 插入的id(或者其他字段 看上一行的SQL 语句)
cursor = conn_exe(*sp)
insert_id = cursor.fetchone()[0]
cursor.close()
return insert_id
def run_sql(*sp):
cursor = conn_exe(*sp)
cursor.close()