当前位置: 首页 > news >正文

Python中数据库连接的管理

在现代应用程序中,数据库是一个至关重要的组件。无论是小型应用还是大型分布式系统,良好的数据库连接管理都是确保系统高效、可靠运行的关键。本文将详细介绍在Python中管理数据库连接的最佳实践和技术,包括连接池、ORM(对象关系映射)以及如何确保数据库操作的安全性和性能。

一、数据库连接的基本概念

在讨论数据库连接管理之前,先了解一些基本概念:

  1. 数据库连接:指应用程序与数据库之间的通信通道。每次应用程序需要访问数据库时,都会建立一个连接。
  2. 连接池:为了减少建立和关闭数据库连接的开销,连接池预先创建一定数量的数据库连接,应用程序可以复用这些连接,从而提高性能。
  3. ORM(对象关系映射):是一种编程技术,用于将数据库中的数据与编程语言中的对象相对应,简化数据库操作。

二、直接使用数据库连接

在Python中,可以直接使用数据库驱动程序进行数据库连接,如sqlite3mysql-connector-pythonpsycopg2等。

2.1 使用sqlite3进行SQLite连接
 

import sqlite3 def get_sqlite_connection(db_path='example.db'): """获取SQLite数据库连接""" conn = sqlite3.connect(db_path) return conn def close_connection(conn): """关闭数据库连接""" if conn: conn.close() # 示例使用 conn = get_sqlite_connection() cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)") conn.commit() close_connection(conn)

2.2 使用mysql-connector-python进行MySQL连接
 

import mysql.connector def get_mysql_connection(): """获取MySQL数据库连接""" conn = mysql.connector.connect( host='localhost', user='yourusername', password='yourpassword', database='yourdatabase' ) return conn def close_connection(conn): """关闭数据库连接""" if conn: conn.close() # 示例使用 conn = get_mysql_connection() cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT)") conn.commit() close_connection(conn)

2.3 使用psycopg2进行PostgreSQL连接

import psycopg2 def get_postgres_connection(): """获取PostgreSQL数据库连接""" conn = psycopg2.connect( host='localhost', user='yourusername', password='yourpassword', dbname='yourdatabase' ) return conn def close_connection(conn): """关闭数据库连接""" if conn: conn.close() # 示例使用 conn = get_postgres_connection() cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(255), age INT)") conn.commit() close_connection(conn)

三、使用连接池

为了提高数据库操作的性能和资源利用效率,建议使用连接池。连接池通过复用数据库连接,减少了频繁打开和关闭连接的开销。

3.1 使用sqlalchemy连接池

SQLAlchemy内置了连接池管理功能,且支持多种数据库。下面以MySQL为例:

from sqlalchemy import create_engine def get_engine(): """获取SQLAlchemy引擎""" engine = create_engine('mysql+mysqlconnector://yourusername:yourpassword@localhost/yourdatabase', pool_size=10, max_overflow=20) return engine def get_connection(engine): """获取数据库连接""" conn = engine.connect() return conn def close_connection(conn): """关闭数据库连接""" if conn: conn.close() # 示例使用 engine = get_engine() conn = get_connection(engine) conn.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT)") close_connection(conn)

3.2 使用pymysql连接池

import pymysql from DBUtils.PooledDB import PooledDB def get_pymysql_pool(): """获取pymysql连接池""" pool = PooledDB( creator=pymysql, maxconnections=10, mincached=2, maxcached=5, blocking=True, host='localhost', user='yourusername', password='yourpassword', database='yourdatabase' ) return pool def get_connection(pool): """获取数据库连接""" conn = pool.connection() return conn def close_connection(conn): """关闭数据库连接""" if conn: conn.close() # 示例使用 pool = get_pymysql_pool() conn = get_connection(pool) cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT)") conn.commit() close_connection(conn)

四、使用ORM(对象关系映射)

ORM使得数据库操作更加直观,能够直接对对象进行增删改查操作。SQLAlchemy是Python中最流行的ORM库之一。

4.1 安装SQLAlchemy

pip install sqlalchemy

4.2 使用SQLAlchemy ORM

使用SQLAlchemy ORM可以简化数据库操作。下面以SQLite为例:

from sqlalchemy import create_engine, Column, Integer, String, Sequence from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 创建数据库引擎 engine = create_engine('sqlite:///example.db', echo=True) # 创建基类 Base = declarative_base() # 定义模型类 class User(Base): __tablename__ = 'users' id = Column(Integer, Sequence('user_id_seq'), primary_key=True) name = Column(String(50)) age = Column(Integer) # 创建表 Base.metadata.create_all(engine) # 创建会话 Session = sessionmaker(bind=engine) session = Session() # 插入数据 new_user = User(name='Alice', age=25) session.add(new_user) session.commit() # 查询数据 users = session.query(User).all() for user in users: print(user) # 更新数据 user = session.query(User).filter_by(name='Alice').first() user.age = 26 session.commit() # 删除数据 user = session.query(User).filter_by(name='Alice').first() session.delete(user) session.commit()

五、数据库操作的最佳实践

5.1 使用上下文管理器

使用上下文管理器可以确保数据库连接在使用完后被正确关闭,避免资源泄漏。

import sqlite3 from contextlib import contextmanager @contextmanager def get_sqlite_connection(db_path='example.db'): conn = sqlite3.connect(db_path) try: yield conn finally: conn.close() # 示例使用 with get_sqlite_connection() as conn: cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)") conn.commit()

5.2 使用事务

确保数据库操作的原子性和一致性,使用事务进行批量操作,确保要么全部成功,要么全部失败。

 

def insert_users(users): with get_sqlite_connection() as conn: cursor = conn.cursor() try: for user in users: cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (user['name'], user['age'])) conn.commit() except Exception as e: conn.rollback() raise e # 示例使用 users = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}] insert_users(users)

5.3 使用参数化查询

避免SQL注入攻击,使用参数化查询来执行数据库操作。

def get_user_by_name(name): with get_sqlite_connection() as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE name = ?", (name,)) return cursor.fetchone() # 示例使用 user = get_user_by_name('Alice') print(user)

六、数据库连接池的高级配置

6.1 SQLAlchemy连接池高级配置

SQLAlchemy提供了丰富的连接池配置选项,可以根据需求进行调整。

 

from sqlalchemy.pool import QueuePool # 自定义连接池 engine = create_engine( 'mysql+mysqlconnector://yourusername:yourpassword@localhost/yourdatabase', poolclass=QueuePool, pool_size=10, max_overflow=20, pool_timeout=30, pool_recycle=3600 ) # 示例使用 conn = engine.connect() conn.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT)") conn.close()

6.2 使用Redis作为连接池

可以使用Redis作为连接池管理数据库连接,提高连接管理的灵活性和扩展性。

 

import redis from redis.connection import BlockingConnectionPool # 创建Redis连接池 pool = BlockingConnectionPool(host='localhost', port=6379, db=0, max_connections=10) def

相关文章:

Python中数据库连接的管理

在现代应用程序中,数据库是一个至关重要的组件。无论是小型应用还是大型分布式系统,良好的数据库连接管理都是确保系统高效、可靠运行的关键。本文将详细介绍在Python中管理数据库连接的最佳实践和技术,包括连接池、ORM(对象关系映…...

【JAVA技术】mybatis 数据库敏感字段加解密方案

引言:自从有公司项目前2年做了三级等保,每年一度例行公事,昨天继续配合做等保测试。这2天比较忙,这里整理之前写的一篇等保技术文章。 正文: 现在公司项目基本用mybatis实现,但由于项目跨度年份比较久&…...

Collections工具类及其案例

package exercise;public class Demo1 {public static void main(String[] args) {//可变参数//方法形参的个数是可以发生变化的//格式:属性类型...名字//int...argsint sum getSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);System.out.println(sum);}//底层:可…...

Duck Bro的第512天创作纪念日

Tips:发布的文章将会展示至 里程碑专区 ,也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作?2. 创作这些文章是为了赚钱吗&#xff1f…...

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

🚀时空传送门 🔍引言📕GPT-4概述🌹机器学习在GPT-4中的应用🚆文本生成与摘要🎈文献综述与知识图谱构建🚲情感分析与文本分类🚀搜索引擎优化💴智能客服与虚拟助手&#x1…...

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册 晨控CK-UR12-E01 是天线一体式超高频读写器头,工作频率默认为902MHz~928MHz,符合EPC Global Class l Gen 2/IS0-18000-6C 标准,最大输出功率 33dBm。读卡器同时…...

模板显式、隐式实例化和(偏)特化、具体化的详细分析

最近看了<The C Programing Language>看到了模板的特化&#xff0c;突然想起来<C Primer>上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀&#xff0c;我在网上了找了好多帖子&#xff0c;才把概念给理清楚。 看着这么多叫法&#xff0c;其…...

软件设计师笔记-计算机系统基础知识

CPU的功能 CPU(中央处理器)是计算机的核心部件,负责执行计算机的指令和处理数据。它的功能主要可以分为程序控制、操作控制、时间控制和数据处理四个方面: 程序控制:CPU的首要任务是执行存储在内存中的程序。程序控制功能确保CPU能够按照程序的指令序列,一条一条地执行。…...

flink 作业动态维护更新,不重启flink,不提交作业

Flink任务实时获取并更新规则_flink任务流实时变更-CSDN博客 一种动态更新flink任务配置的方法_flink 数据源 动态更新-CSDN博客 Flink CEP在实时风控场景的落地与优化 最佳实践 - 在SQL任务中使用Flink CEP - 《实时计算用户手册-v4.5.0》 Flink SQL CEP详解-CSDN博客 如…...

为何数据仓库需要“分层次”?

在数据驱动的商业世界中&#xff0c;数据仓库是企业决策的心脏。然而&#xff0c;一个高效、可扩展且易于管理的数据仓库&#xff0c;需要精心设计和构建。分层是构建数据仓库的关键策略之一。本文将探讨数据仓库分层的重要性以及它如何帮助企业更好地管理数据。 数据仓库分层…...

小熊家务帮day15-day18 预约下单模块(预约下单,熔断降级,支付功能,退款功能)

目录 1 预约下单1.1 需求分析1.1.1 业务流程1.1.2 订单状态 1.2 系统设计1.2.1 订单表设计1.2.2 表结构的设置 1.3 开发远程调用接口1.3.0 复习下远程调用的开发1.3.1 查询地址簿远程接口jzo2o-api工程定义接口Customer服务实现接口 1.3.2 查询服务&服务项远程接口jzo2o-ap…...

[word] word悬挂缩进怎么设置? #经验分享#职场发展#经验分享

word悬挂缩进怎么设置&#xff1f; 在编辑Word的时候上方会有个Word标尺&#xff0c;相信很多伙伴都没使用过。其实它隐藏着很多好用的功能&#xff0c;今天就给大家分享下利用这个word标尺的悬挂缩进怎么设置&#xff0c;一起来看看吧&#xff01; 1、悬挂缩进 选中全文&…...

6-Maven的使用

6-Maven的使用 常用maven命令 //常用maven命令 mvn -v //查看版本 mvn archetype:create //创建 Maven 项目 mvn compile //编译源代码 mvn test-compile //编译测试代码 mvn test //运行应用程序中的单元测试 mvn site //生成项目相关信息的网站 mvn package //依据项目生成 …...

WPF真入门教程32--WPF数字大屏项目实干

1、项目背景 WPF (Windows Presentation Foundation) 是微软的一个框架&#xff0c;用于构建桌面客户端应用程序&#xff0c;它支持富互联网应用程序&#xff08;RIA&#xff09;的开发。在数字大屏应用中&#xff0c;WPF可以用来构建复杂的用户界面&#xff0c;展示庞大的数据…...

数据可视化Python实现超详解【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…...

Maxkb玩转大语言模型

Maxkb玩转大语言模型 随着国外大语言模型llama3的发布&#xff0c;搭建本地个人免费“人工智能”变得越来越简单&#xff0c;今天博主分享使用Max搭建本地的个人聊天式对话及个人本地知识域的搭建。 1.安装Maxkb开源应用 github docker快速安装 docker run -d --namemaxkb -p 8…...

React Hooks 封装可粘贴图片的输入框组件(wangeditor)

需求是需要一个文本框 但是可以支持右键或者ctrlv粘贴图片&#xff0c;原生js很麻烦&#xff0c;那不如用插件来实现吧~我这里用的wangeditor插件&#xff0c;初次写初次用&#xff0c;可能不太好&#xff0c;但目前是可以达到实现需求的一个效果啦&#xff01;后面再改进吧~ …...

Wireshark TS | 应用传输丢包问题

问题背景 仍然是来自于朋友分享的一个案例&#xff0c;实际案例不难&#xff0c;原因也就是互联网线路丢包产生的重传问题。但从一开始只看到数据包截图的判断结果&#xff0c;和最后拿到实际数据包的分析结果&#xff0c;却不是一个结论&#xff0c;方向有点跑偏&#xff0c;…...

架构设计-web项目中跨域问题涉及到的后端和前端配置

WEB软件项目中经常会遇到跨域问题&#xff0c;解决方案早已是业内的共识&#xff0c;简要记录主流的处理方式&#xff1a; 跨域感知session需要解决两个问题&#xff1a; 1. 跨域问题 2. 跨域cookie传输问题 跨域问题 解决跨域问题有很多种方式&#xff0c;如使用springboot…...

==Redis淘汰策略(内存满了触发)==

好的&#xff0c;面试官。这个问题我需要从三个方面来回答。第一个方面&#xff1a; 当 Redis 使用的内存达到 maxmemory 参数配置的阈值的时候&#xff0c;Redis 就会根据配置的内存淘汰策略。 把访问频率不高的 key 从内存中移除。maxmemory 默认情况是当前服务器的最大内存…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...