数据库编程中游标 连接 commit

在数据库编程中,关闭游标和连接是一个重要的步骤,确保资源正确地释放和数据库操作的完整性。

游标(Cursor)和连接(Connection)是数据库编程中两个关键但不同的概念。它们在数据库操作中的作用和功能有所不同。以下是详细的区别和它们各自的作用:

1 连接(Connection)

定义
  • 连接是应用程序与数据库服务器之间的通道或会话。通过这个通道,应用程序可以发送SQL查询和命令,接收数据库的响应。
作用
  • 建立会话:连接在应用程序与数据库服务器之间建立一个会话,使得应用程序能够访问和操作数据库。
  • 事务管理:连接管理着事务的开始、提交和回滚。一个连接通常对应一个事务上下文。
  • 资源分配:连接是数据库资源分配的单位。每个连接消耗服务器的资源,如内存和CPU。
使用示例
import pymysql# 创建数据库连接
conn = pymysql.connect(host='localhost', user='user', passwd='password', db='database')# 进行数据库操作...# 关闭连接
conn.close()

2 游标(Cursor)

定义
  • 游标是一个数据库对象,它通过连接建立,允许逐行处理查询结果集。游标提供了从结果集中检索记录的机制。
作用
  • 执行SQL语句:游标用于执行SQL查询和命令。通过游标,应用程序可以发送SQL语句到数据库服务器。
  • 检索结果集:游标可以逐行检索查询结果集中的记录。它提供了遍历结果集的能力。
  • 批处理操作:游标允许在结果集上进行批量处理,例如更新、删除操作。
使用示例
import pymysql# 创建数据库连接
conn = pymysql.connect(host='localhost', user='user', passwd='password', db='database')# 创建游标
cursor = conn.cursor()# 执行SQL查询
cursor.execute("SELECT * FROM table_name")# 获取查询结果
results = cursor.fetchall()# 逐行处理结果
for row in results:print(row)# 关闭游标
cursor.close()# 关闭连接
conn.close()

3 主要区别

  1. 创建与存在关系

    • 连接:是应用程序与数据库服务器之间的会话,是数据库操作的基础。一个应用程序可以创建多个连接,每个连接代表一个独立的会话。
    • 游标:是通过连接创建的对象,用于执行SQL查询和遍历结果集。一个连接可以创建多个游标,但游标必须依赖连接而存在。
  2. 作用范围

    • 连接:管理整个会话的生命周期,包括事务的开始、提交和回滚。它是数据库资源分配和管理的单位。
    • 游标:管理SQL语句的执行和结果集的遍历。它用于具体的数据库操作,如查询、插入、更新和删除。
  3. 事务管理

    • 连接:负责管理事务的边界。通过连接,可以开始一个事务、提交事务或回滚事务。
    • 游标:不直接管理事务,但它执行的SQL语句受连接的事务管理。例如,游标执行的查询在连接提交事务之前都在同一个事务上下文中。
  4. 资源消耗

    • 连接:每个连接消耗较多的数据库资源,如内存和CPU。保持大量未关闭的连接会导致服务器性能下降。
    • 游标:每个游标消耗的资源相对较少,但未关闭的游标仍会占用内存和服务器资源。保持大量未关闭的游标也会影响性能。

4 关闭游标和连接的最佳时机

取决于具体的应用场景和代码结构。以下是一些指导原则:

1. 关闭游标

什么时候关闭游标
  • 短生命周期查询:对于一次性查询或操作,应该在操作完成后立即关闭游标。
  • 批处理操作:在批处理操作中,每次完成一批操作后关闭游标,以防止资源泄漏。
  • 长期运行任务:对于长期运行的任务,定期关闭游标以释放资源。
关闭游标的原则
  • 及时关闭:一旦游标不再需要,立即关闭,以释放资源。
  • 异常处理:在捕获异常时,也应确保游标被关闭。
示例代码
import pymysqldef fetch_data():conn = pymysql.connect(host='localhost', user='user', passwd='password', db='database')cursor = conn.cursor()try:cursor.execute("SELECT * FROM table_name")results = cursor.fetchall()for row in results:print(row)except Exception as e:print(f"Error: {e}")finally:cursor.close()  # 确保游标被关闭conn.close()    # 确保连接被关闭fetch_data()

2. 关闭连接

什么时候关闭连接
  • 短生命周期应用:对于短生命周期的应用,如脚本或短时间运行的程序,在程序结束时关闭连接。
  • 长期运行应用:对于长期运行的应用或服务器,连接应在处理完特定任务或会话后关闭。
  • 连接池使用:在使用连接池的情况下,连接的管理通常由连接池负责,程序不需要显式关闭连接。
关闭连接的原则
  • 事务管理:确保所有事务在关闭连接前已经提交或回滚。
  • 异常处理:在捕获异常时,确保连接被关闭。
  • 连接池:如果使用连接池,不需要手动关闭连接,但需要确保连接正确归还到池中。
示例代码
import pymysqldef execute_query():conn = pymysql.connect(host='localhost', user='user', passwd='password', db='database')try:with conn.cursor() as cursor:cursor.execute("SELECT * FROM table_name")results = cursor.fetchall()for row in results:print(row)except Exception as e:print(f"Error: {e}")finally:conn.close()  # 确保连接被关闭execute_query()

3. 每次查询都关闭游标和连接吗

  • 单次操作:对于单次操作,应该在操作完成后立即关闭游标和连接。
  • 批量操作:对于需要多次查询或操作的任务,可以复用一个连接和游标,但在任务完成后需要关闭。
  • 高频操作:对于高频率的操作,使用连接池来管理连接,避免频繁打开和关闭连接带来的开销。

使用连接池

使用连接池可以有效管理连接,避免频繁创建和销毁连接带来的开销,并且连接池会自动处理连接的复用和关闭。以下是一个使用连接池的示例:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# 创建连接池
engine = create_engine('mysql+pymysql://user:password@localhost/database', pool_size=5, max_overflow=10)
Session = sessionmaker(bind=engine)def execute_query():session = Session()try:result = session.execute("SELECT * FROM table_name").fetchall()for row in result:print(row)except Exception as e:print(f"Error: {e}")finally:session.close()  # 确保连接被归还到连接池execute_query()

关闭连接会隐式关闭游标:当连接被关闭时,所有与该连接关联的游标也会被关闭。这是因为游标依赖于连接的资源来执行操作。如果只关闭连接而不显式关闭游标,虽然游标会被隐式关闭,但这不是一个好的编程实践。这可能会导致游标对象在程序中继续存在,占用内存,直到垃圾回收机制清理它们。显式关闭游标是一个好的习惯,有助于明确和干净地管理资源,防止资源泄漏。

在使用MySQL数据库时,理解什么时候需要 commitautocommit 的概念对确保数据的一致性和完整性非常重要。以下是对这些概念的详细解释:

5 commitautocommit

commit 的作用

commit 是用来结束当前事务,并将所有对数据库的更改永久保存到数据库中。只有在执行 commit 后,事务中的所有更改才会生效并对其他事务可见。

什么时候需要 commit
  • 事务操作:当使用事务管理数据时,例如插入、更新、删除等操作,需要在完成一组操作后使用 commit 来确保这些更改被永久保存。
  • 多步骤操作:在执行一系列相关的数据库操作时,可以将它们包裹在一个事务中,操作完成后使用 commit 来确保所有操作要么全部成功,要么全部失败。
什么时候不需要 commit
  • 查询操作:对于只读的查询操作,不需要使用 commit,因为查询操作不会对数据库进行更改。
  • 自动提交模式:如果 autocommit 模式开启,每个独立的SQL语句都会被当作一个事务并在执行后立即提交。

2. autocommit 模式

定义

autocommit 是数据库连接的一个属性,当开启时,每个独立的SQL语句都会自动作为一个事务提交。也就是说,不需要显式调用 commit,每个语句执行后都会立即生效。

开启和关闭 autocommit
  • 开启 autocommit:每个SQL语句在执行后会自动提交,不需要显式调用 commit
  • 关闭 autocommit:需要手动管理事务,显式调用 commit 来提交事务。
使用场景
  • 开启 autocommit:适用于大多数简单的CRUD操作和查询操作,减少了事务管理的复杂性。
  • 关闭 autocommit:适用于需要事务管理的场景,例如需要确保多步骤操作的一致性和原子性。

示例代码

以下是关于 commitautocommit 的具体使用示例:

自动提交模式(autocommit 开启)
import pymysqlconn = pymysql.connect(host='localhost', user='user', passwd='password', db='database', autocommit=True)
cursor = conn.cursor()# 自动提交模式下,不需要显式调用 commit
cursor.execute("INSERT INTO table_name (column1, column2) VALUES (value1, value2)")
cursor.execute("UPDATE table_name SET column1 = value WHERE column2 = value2")cursor.close()
conn.close()
手动提交模式(autocommit 关闭)
import pymysqlconn = pymysql.connect(host='localhost', user='user', passwd='password', db='database', autocommit=False)
cursor = conn.cursor()try:cursor.execute("INSERT INTO table_name (column1, column2) VALUES (value1, value2)")cursor.execute("UPDATE table_name SET column1 = value WHERE column2 = value2")conn.commit()  # 显式提交事务
except Exception as e:conn.rollback()  # 出现异常时回滚事务print(f"Error: {e}")
finally:cursor.close()conn.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

100个python的基本语法知识【下】

50. 压缩文件: import zipfilewith zipfile.ZipFile("file.zip", "r") as zip_ref:zip_ref.extractall("extracted")51. 数据库操作: import sqlite3conn sqlite3.connect("my_database.db") cursor conn.c…

公告 | 长安链v2.3.4版本更新,增强功能、健全性和易用性

近期长安链长期支持版本v2.3.4发布,在功能、健全性和易用性方面进行了升级,是长安链2.3.x将近两年来的第五个版本,支持2.3.x版本的平滑升级,欢迎升级体验。 主要功能迭代 在功能上新增PK模式下支持grpcs连接、sdk支持自定义规则订…

递归神经网络(RNN)及其预测和分类的Python和MATLAB实现

递归神经网络(Recurrent Neural Networks,RNN)是一种广泛应用于序列数据建模的深度学习模型。相比于传统的前馈神经网络,RNN具有记忆和上下文依赖性的能力,适用于处理具有时序关联性的数据,如文本、语音、时…

主流树模型讲解、行列抽样、特征重要性梳理总结

本文旨在总结一下常见树模型的行、列抽样特点以及特征重要性的计算方式,也会带着过一遍算法基本原理,一些细节很容易忘记啊。 主要是分类和回归两类任务,相信能搜索这篇文章的你,应该对树模型有一定的了解。 可以搜索 总结 &…

java设计模式:04-03-解释器模式

解释器模式 (Interpreter Pattern) 定义 解释器模式是一种行为型设计模式,它提供了解释语言(或表达式)文法的一种方法,通过定义一系列语言(或表达式)的解释器,将文法中的句子转换为计算结果。…

老鼠后五毒也来凑热闹!网红食品惊现「壁虎头」,胖东来已下架…

上周,老鼠有点忙,比如其连续被曝出,出现在了方便面知名品牌的调料包、知名连锁餐饮品牌的黄焖鸡饭中。‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 在小柴「被「添加」进方便面、黄焖鸡饭?老鼠最近忙疯了……」这篇文章的评论区,柴油…

计算机视觉与面部识别:技术、应用与未来发展

引言 在当今数字化时代,计算机视觉技术迅速发展,成为人工智能领域的一个重要分支。计算机视觉旨在让机器理解和解释视觉信息,模拟人类的视觉系统。它在各行各业中发挥着重要作用,从自动驾驶汽车到智能监控系统,再到医疗…

数据库多表联查

一、内联查询 内联查询只有完全满足条件的数据才能出现的结果1.1 非等值联查 笛卡尔积,查到的结果具有不一致性 示例: select * from student,class1.2 等值查询 -- 查询出学生表和班级信息select * from student,class where student.classidclass.c…

物联网设备的画面(摄像头)嵌入到网页中,实时视频画面解决方案

一、将物联网设备的画面嵌入到网页中,通常有多种常见方式和解决方案。下面是一些常用的方法和技术: 1. 使用RTSP流 描述:通过RTSP协议流传输视频,可以通过播放器在网页中播放实时视频。解决方案: VLC.js:…

Python:对常见报错导致的崩溃的处理

Python的注释: mac用cmd/即可 # 注释内容 代码正常运行会报以0退出,如果是1,则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字,程序会崩溃,也就是破坏了程序,终止运行 解决方案&#xf…

ios CCUIFont.m

// // CCUIFont.h // CCFC // //#import <Foundation/Foundation.h>// 创建字体对象 #define CREATE_FONT(fontSize) [UIFont systemFontOfSize:(fontSize)]interface UIFont(cc) (void)logAllFonts;end // // CCUIFont.m // CCFC // //#import "CCUIFont.h&…

贪心算法(三) ---cmp_to_key, 力扣452,力扣179

目录 cmp_to_key 比较函数 键函数 cmp_to_key 的作用 使用 cmp_to_key 代码解释 力扣452 ---射气球 题目 分析 代码 力扣179 ---最大数 题目 分析 代码 cmp_to_key 在Python中&#xff0c;cmp_to_key 是一个函数&#xff0c;它将一个比较函数转换成一个键函数…

Problems retrieving the embeddings data form OpenAI API Batch embedding job

题意&#xff1a;从OpenAI API批量嵌入作业中检索嵌入数据时遇到问题 问题背景&#xff1a; I have to embed over 300,000 products description for a multi-classification project. I split the descriptions onto chunks of 34,337 descriptions to be under the Batch e…

Nginx优化、防盗链

目录 Nginx优化 隐藏版本信息 网站缓存 日志切割 超时时间 更改进程数 网页压缩 防盗链 在使用源码软件包安装过Nginx服务&#xff0c;具体步骤看上一篇文章 功能模块位置 在Nginx的解压目录下的auto目录内的options文件可以查看Nginx可以安装的功能模块 [rootlocal…

关于InnoDB行锁和4种锁是怎么实现的?

InnoDB 的行锁实现主要基于索引&#xff0c;并通过多种类型的锁来确保数据的一致性和并发控制。以下是InnoDB行锁实现的几个关键点&#xff1a; 记录锁&#xff08;Record Locks&#xff09;&#xff1a;这种锁直接锁定某行记录的索引记录。它通常用于唯一索引或主键索引上&…

ubuntu20.04安装终端终结者并设置为默认终端

1、安装 terminator sudo apt-get install terminator 2、Ctrl Alt T 试一下打开什么终端&#xff0c;我的默认启动的是terminator;如果想换换默认的终端&#xff0c;还需以下一步 3、安装dconf-tools&#xff0c;这个是设置默认终端的必须 sudo apt-get install dconf-tools…

数据结构初阶-单链表

链表的结构非常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 x 2 x 2&#xff09;链表结构&#xff1a; 而我们主要要熟悉的单链表与双向链表的全称分别为&#xff1a;不带头单向不循环链表&#xff0c;带头双向循环链表&#xff0c;当我们对这两种链表熟悉后&#x…

重生之我们在ES顶端相遇第5章-常用字段类型

思维导图 前置 在第4章&#xff0c;我们提到了 keyword&#xff08;一笔带过&#xff09;。在本章&#xff0c;我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。 字段类型 ES 支持以下字段类型&#xff08;仅介绍开发中常用&#xff0c;更多内容请自…

大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)

前言 按照我们之前的分享&#xff08;大模型应用RAG系列3-1从0搭建一个RAG&#xff1a;做好文档切分&#xff09;&#xff1a; RAG系统搭建的基本流程 准备对应的垂域资料文档的读取解析&#xff0c;进行文档切分将分割好的文本灌入检索引擎&#xff08;向量数据库&#xff…

AI App Store-AI用户评价-多维度打分对比pk-AI社区

C端用户、创作者、AI达人们在选择众多国内外AI厂商的服务时候往往感到一头雾水&#xff0c;那么多功能接近的AI应用(智能对话类、文档总结类、文生图、AI搜索引擎) 究竟在不同用户需求场景下表现怎么样。大部分人如果有需求都会所有平台都尝试一遍&#xff0c;比如一个博主生成…