目录
场景
- 在python脚本中需要连接数据库,只需要连接关闭一次。
- 需要在多线程中连接数据库,由于连接-关闭数据库的时间开销较大,需要一种一次连接,可供多个线程使用的连接数据库的方式。
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 文档