PostgreSql

目录

场景

psycopg2

特点

单线程

函数

方法

示例

多线程

示例

DBUtils

PostgreSQL

示例

参考


场景

  1. 在python脚本中需要连接数据库,只需要连接关闭一次。
  2. 需要在多线程中连接数据库,由于连接-关闭数据库的时间开销较大,需要一种一次连接,可供多个线程使用的连接数据库的方式。

psycopg2

安装

pip install psycopg2

特点

  • 简单易用: Psycopg2提供了简单的API,易于学习和使用。
  • 高性能: Psycopg2是基于C语言实现的,能够提供高效的数据库操作。
  • 完全兼容: Psycopg2与PostgreSQL数据库完全兼容,并支持大多数PostgreSQL特性。
  • 安全性: Psycopg2具有内置的防止SQL注入攻击的功能,能够保证数据安全。

单线程

函数

  • connect(dsn, …):建立与PostgreSQL数据库的连接。dsn是一个字典,包含了连接数据库需要的各种参数,如用户名、密码、主机名、数据库名等。
  • cursor():建立一个游标对象,用于执行SQL查询和修改等操作。
  • execute(sql[, args]):执行SQL语句。sql是要执行的SQL语句,args是可选的参数,可以是一个列表或一个字典,用于将变量传递给SQL语句。
  • fetchone():获取查询结果的下一行数据。
  • fetchall():获取所有查询结果的数据。
  • commit():提交事务。
  • rollback():回滚事务。
  • close():关闭数据库连接。

方法

  • 建立数据库连接:使用psycopg2库提供的connect()方法建立与数据库的连接。
  • 执行SQL语句:使用psycopg2提供的方法执行SQL语句,如查询、插入、更新等操作。
  • 处理查询结果:如果执行的是查询操作,需要使用fetchone()或fetchall()方法来处理查询结果。
  • 关闭连接:最后需要使用close()方法关闭数据库连接。

示例

import psycopg2

def main(database,username,password,host,port):
    sql = "select * from table where condition"
    con=psycopg2.connect(
        database=database,user=username,password=password,host=host,port=port)
    con.autocommit = True  # 如果不设置自动提交,
    cur = con.cursor()
    cur.execute(sql)  # 需要在cur.execute(sql) 后加上con.commit()
    data = cur.fetchall()
    con.commit()
    cur.close()
    con.close()
    for i in data: print(i)
    return

if __name__ == "__main__":
    main(database,username,password,host,port)

多线程

  • psycopg2.pool.SimpleConnectionPool:无法在不同线程之间共享的连接池。
  • psycopg2.pool.ThreadedConnectionPool:与线程模块配合使用的连接池。

psycopg2.pool.ThreadedConnectionPool仅支持多线程,不支持多进程。

示例

from psycopg2.pool import ThreadedConnectionPool
from multiprocessing.pool import ThreadPool

def thread(args):
    sql,conn_pool=args
    conn = conn_pool.getconn()  
    conn.autocommit = True
    cursor = conn.cursor()  
    cursor.execute(sql)
    cursor.close()
    conn_pool.putconn(conn,key=None,close=False)

def main(sqls,pgparams):
    minconn = 1
    maxconn = 10
    connection_pool = ThreadedConnectionPool(minconn,maxconn,**pgparams)   
    
    args_list = list(map(lambda x:[x,connection_pool ],slqs)) 
    pool_size = max(1,min(len()))
    threadpool = ThreadPool(pool_size)
    threadpool.map(thread,args_list)
    threadpool.close()
    threadpool.join()

    conn_pool.closeall()
    return

if __name__ == "__main__":
    pgparams = {
        'dbname':'fdfdgdsfgs', 
        'user':'postgres', 
        'host':"0.0.0.0", 
        'password':'12345', 
        'port':'6666'}
    sqls = [....]  # sql语句列表
    main(sqls,pgparams)

DBUtils

安装:

pip3 install DBUtils

安装好PostgreSQL后,开启本地服务,可通过Navicat连接数据库并导入excel数据项,注意数据库名、表名、字段名时均使用小写字母,如使用大写字母,在生成对应表名和字段会自动加上“”,影响查询,此外注意避开关键词,比如id,name,group之类SQL需要保留关键词。

PostgreSQL

示例

import psycopg2
# from  DBUtils.PooledDB import PooledDB # DBUtils 3.0.2版本无法使用,改为下列代码
from dbutils.pooled_db import PooledDB

POOL = PooledDB(
    creator=psycopg2,  # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的链接,0表示不创建
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    ping=0,  # ping SQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always

    host='127.0.0.1',
    port=5432,
    user='postgres',
    password='postgres',
    database='9000cw',
    # charset='utf8'
)


def fetchall(sql, *args):
    """ 获取所有数据 """
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, args)
    result = cursor.fetchall()
    cursor.close()
    conn.close()
    return result


def fetchone(sql, *args):
    """ 获取单行数据 """
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, args)
    result = cursor.fetchone()
    cursor.close()
    conn.close()
    return result


if __name__ == "__main__":
    sql = 'SELECT * FROM personnel_information where name_= %S'
    result = fetchall(sql, '张三') # 需要注意这里只在筛选字段下可用,筛选表时不可用,  # 合成的sql语句为SELECT * FROM personnel_information where name_= '张三', 多了前后单引号
    print(result)

参考

(46条消息) python库之—psycopg2_ㄣ知冷煖★的博客-CSDN博客

psycopg2.pool – 连接池 — Psycopg 2.9.6 文档

Python数据库连接池DBUtils详解 - ''竹先森゜ - 博客园 (cnblogs.com)

python使用dbutils连接PostgreSQL - 毛绒绒 - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值