python使用DBUtil连接池封装psycopg2/hologres

简介: 这段代码是一个Python类`PsycopgConn`,用于管理PostgreSQL数据库连接池。类使用了`dbutils.pooled_db.PooledDB`来创建连接池,支持多线程,并提供了获取连接、关闭连接池、执行查询(`SelectSql`)、插入(`InsertSql`)和更新(`UpdateSql`)SQL的方法。类实现单例模式以确保只有一个实例存在。连接配置包括主机、端口等



pip install psycopg2 psycopg2-binary



import psycopg2
import datetime
import base64

import sys
import psycopg2.extras
from dbutils.pooled_db import PooledDB
import threading
import traceback
 

u = ''
p = ''

 
"""
全局单例 连接池
"""
class PsycopgConn:
    # 多线程的锁 针对单例初始化的过程 加锁
    _instance_lock = threading.Lock()
 
    """
    init在new之后被调用
    """
    def __init__(self):
        self.init_pool()
 
    """
    重载构造函数 实现全局单例
    """
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            with PsycopgConn._instance_lock:
                if not hasattr(cls, '_instance'):
                    PsycopgConn._instance = object.__new__(cls)
                return PsycopgConn._instance
 
    def get_pool_conn(self):
        """
        获取连接池连接
        :return:
        """
        if not self._pool:
            self.init_pool()
        return self._pool.connection()
 
    def init_pool(self):
        """
        初始化连接池
        :return:
        """
        try:
            pool = PooledDB(
                creator=psycopg2,  # 使用连接数据库的模块 psycopg2
                maxconnections=20,  # 连接池允许的最大连接数,0 和 None 表示不限制连接数
                mincached=1,  # 初始化时,链接池中至少创建的空闲的链接,0 表示不创建
                maxcached=5,  # 链接池中最多闲置的链接,0 和 None 不限制
                blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
                maxusage=None,  # 一个链接最多被重复使用的次数,None 表示无限制
                setsession=[],  # 开始会话前执行的命令列表
                host='imp-sothebys-cn-internal-zhangbei.hologres.aliyuncs.com',
                port=8099,
                user=u.decode("utf-8"),
                password=p.decode("utf-8"),
                database='sothebys_data')
            self._pool = pool
        except:
            logger.error("trace back: %s", traceback.format_exc())
            logger.info('connect postgresql error')
            self.close_pool()
 
    def close_pool(self):
        """
        关闭连接池连接
        :return:
        """
        if self._pool != None:
            self._pool.close()
 
    def SelectSql(self, sql):
        """
        查询
        :param sql:
        :return:
        """
        try:
            conn = self.get_pool_conn()
            cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)  # 设置返回格式为字典
            cursor.execute(sql)
            result = cursor.fetchall()
        except Exception as e:
            logger.error("trace back: %s", traceback.format_exc())
            logger.info('execute sql {0} is error'.format(sql))
        finally:
            cursor.close()
            conn.close()
        return result
 
    def InsertSql(self, sql):
        """
        插入数据
        :param sql:
        :return:
        """
        try:
            conn = self.get_pool_conn()
            cursor = conn.cursor()
            cursor.execute(sql)
            result = True
        except Exception as e:
            logger.error("trace back: %s", traceback.format_exc())
            logger.info('ERROR: execute  {0} causes error'.format(sql))
        finally:
            cursor.close()
            conn.commit()
            conn.close()
        return result
 
    def UpdateSql(self, sql):
        """
        更新数据
        :param sql:
        :return:
        """
        try:
            conn = self.get_pool_conn()
            cursor = conn.cursor()
            cursor.execute(sql)
            result = True
        except Exception as e:
            logger.error("trace back: %s", traceback.format_exc())
            logger.info('ERROR: execute  {0} causes error'.format(sql))
        finally:
            cursor.close()
            conn.commit()
            conn.close()
        return result



调用者如何使用


pgsql = PsycopgConn()

result = pgsql.SelectSql(sql)



常见报错


1、 undefined symbol: PQconninfo

ImportError: /home/admin/.pyenv/versions/3.6.2/
lib/python3.6/site-packages/psycopg2/
_psycopg.cpython-36m-x86_64-linux-gnu.so: undefined symbol: PQconninfo


装一下这个包即可

pip install psycopg2-binary



相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
相关文章
|
Python
【已解决】ModuleNotFoundError: No module named ‘DBUtils‘,from DBUtils.PooledDB import PooledDB,
【已解决】ModuleNotFoundError: No module named ‘DBUtils‘,from DBUtils.PooledDB import PooledDB,
1804 0
|
SQL 关系型数据库 API
从API获取数据并将其插入到PostgreSQL数据库:步骤解析
使用Python处理从API获取的数据并插入到PostgreSQL数据库:安装`psycopg2`,建立数据库连接,确保DataFrame与表结构匹配,然后使用`to_sql`方法将数据插入到已存在的表中。注意数据准备、权限设置、性能优化和安全处理。
|
SQL 关系型数据库 MySQL
Python实现MySQL连接池
python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。
9581 1
|
SQL 关系型数据库 数据库
使用 PostgreSQL 和 Python 实现数据库操作
【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现数据库操作
|
4月前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
49055 72
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
安全 网络安全 数据安全/隐私保护
宝塔面板安全入口校验失败的解决方法
宝塔BT面板新增了安全入口校验,这是一种安全机制,在登录地址的后面加上8位字符的随机码,如果宝塔后台登录地址的随机码不对就会提示“安全入口校验失败”,LAMPLNMP分享解决方法: 另外,很多同学遇到使用阿里云ECS云服务器安装宝塔后无法登录的情况,这是由于安全组的问题,参考官方文档(添加安全组规则开发8888端口 - 阿里云)安全组问题几乎是每个宝塔用户都会遇到的问题,建议参考官方文档。
8033 0
|
小程序 JavaScript Java
基于SpringBoot的智慧停车场微信小程序源码分享
智慧停车场微信小程序主要包含管理端和小程序端。管理端包括停车场管理,公告信息管理,用户信息管理,预定信息管理,用户反馈管理等功能。小程序端包括登录注册,预约停车位,停车导航,停车缴费,用户信息,车辆信息,钱包充值,意见反馈等功能。
1192 5
基于SpringBoot的智慧停车场微信小程序源码分享

相关产品

  • 实时数仓 Hologres