数据库编程中游标 连接 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()

6 字符集设置

在 MySQL 中,字符集和比较规则(collation)管理是一个多层次的概念,涉及服务器级别、数据库级别、表级别和列级别。每个级别都可以设置字符集和比较规则,这些设置会影响数据存储和处理的行为。此外,客户端和服务器之间的通信也涉及字符集的转换。下面是对这些内容的详细说明:

级别的字符集和比较规则

  1. 服务器级别

    • 服务器级别的字符集和比较规则是服务器的默认设置,当没有在数据库、表或列级别指定字符集和比较规则时,这些默认设置将被使用。
    • 通过以下变量设置:
      SET GLOBAL character_set_server = 'utf8mb4';
      SET GLOBAL collation_server = 'utf8mb4_unicode_ci';
      
  2. 数据库级别

    • 当创建数据库时,可以指定字符集和比较规则。如果没有指定,则使用服务器级别的默认值。
    • 通过以下语法设置:
      CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
      
    • 可以通过以下语句查看数据库的字符集和比较规则:
      SHOW CREATE DATABASE db_name;
      
  3. 表级别

    • 当创建表时,可以指定字符集和比较规则。如果没有指定,则使用数据库级别的默认值。
    • 通过以下语法设置:
      CREATE TABLE table_name (...
      ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
      
    • 可以通过以下语句查看表的字符集和比较规则:
      SHOW CREATE TABLE table_name;
      
  4. 列级别

    • 当创建列时,可以指定字符集和比较规则。如果没有指定,则使用表级别的默认值。
    • 通过以下语法设置:
      CREATE TABLE table_name (column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,...
      );
      
    • 可以通过以下语句查看列的字符集和比较规则:
      SHOW FULL COLUMNS FROM table_name;
      

客户端和服务器之间的字符集

  1. character_set_client

    • 这个变量指定客户端使用的字符集。服务器会使用这个字符集来解码客户端发送的请求。
    • 设置方法:
      SET character_set_client = 'utf8mb4';
      
  2. character_set_connection

    • 这个变量指定服务器在处理请求时使用的字符集。服务器会将请求字符串从 character_set_client 转换为 character_set_connection
    • 设置方法:
      SET character_set_connection = 'utf8mb4';
      
  3. character_set_results

    • 这个变量指定服务器在向客户端返回结果时使用的字符集。服务器会将结果字符串从 character_set_connection 转换为 character_set_results
    • 设置方法:
      SET character_set_results = 'utf8mb4';
      

关系与流程

  1. 客户端发送请求

    • 客户端发送的请求使用 character_set_client 字符集编码。
  2. 服务器解码请求

    • 服务器使用 character_set_client 解码请求,将请求字符串转换为 character_set_connection 字符集。
  3. 服务器处理请求

    • 服务器在 character_set_connection 字符集下处理请求,执行相应的操作。
  4. 服务器返回结果

    • 服务器将处理结果从 character_set_connection 字符集转换为 character_set_results 字符集,然后将结果发送给客户端。

使用 MySQLdb 连接 MySQL 数据库

在使用 MySQLdb 连接 MySQL 数据库时,charset 参数设置的是 character_set_client、character_set_connection 和 character_set_results 这三个变量。具体来说,当设置 charset=‘utf8’ 或 charset=‘utf8mb4’ 时,MySQLdb 会将这三个变量全部设置为指定的字符集。

charset 参数的作用
character_set_client:用于告诉 MySQL 服务器,客户端发送的请求字符串使用的字符集。
character_set_connection:用于告诉 MySQL 服务器,在处理请求时应该使用的字符集。
character_set_results:用于告诉 MySQL 服务器,在返回数据给客户端时应该使用的字符集。
当设置 charset=‘utf8’ 时,MySQLdb 会执行以下 SQL 命令:
SET NAMES ‘utf8’;
这实际上等同于执行:
SET character_set_client = ‘utf8’, character_set_connection = ‘utf8’, character_set_results = ‘utf8’;

当设置 charset=‘utf8mb4’ 时,MySQLdb 会执行以下 SQL 命令:
SET NAMES ‘utf8mb4’;
这实际上等同于执行:
SET character_set_client = ‘utf8mb4’, character_set_connection = ‘utf8mb4’, character_set_results = ‘utf8mb4’;

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

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

相关文章

总结一些vue3小知识3

总结一些vue3小知识1:http://t.csdnimg.cn/C5vER 总结一些vue3小知识2:http://t.csdnimg.cn/sscid 1.限制时间选择器只能选择后面的日期 说明:disabled-date属性是一个用来判断该日期是否被禁用的函数,接受一个 Date 对象作为参…

科普文:分布式架构中的三高:高并发、高性能、高可用

关于高并发 高并发场景 互联网应用以及云计算的普及,使得架构设计和软件技术的关注点从如何实现复杂的业务逻 辑,转变为如何满足大量用户的高并发访问请求。 一个简单的计算处理过程,如果一旦面对大量的用户访问,整个技术挑战就…

DP 整数拆分不同的二叉搜索树 DAY21

整数拆分? 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。示例 2: 输入: n 10 输…

实验2-2-1 温度转换

#include<stdio.h> #include <math.h> int main(){int c,f150;c5*(f-32)/9;printf("fahr 150, celsius %d",c); }

sqlilabs解题方法

Lass1 查询id为1的用户名和密码 查询id为2的用户名和密码 没有回显&#xff0c;不含id-1的行 判断字段数&#xff0c;字段数为3 查询数据库用户名&#xff0c;和数据库名 查询时id必须超出数据库以外&#xff0c;一般用-1 用户名&#xff1a;user() 数据库名&#xff1a;databa…

redis:清除缓存的最简单命令示例

清除redis缓存命令(执行命令列表见截图) 1.打开cmd窗口&#xff0c;并cd进入redis所在目录 2.登录redis redis-cli 3.查询指定队列当前的记录数 llen 队列名称 4.清除指定队列所有记录 ltrim 队列名称 1 0 5.再次查询&#xff0c;确认队列的记录数是否已清除

opencascade AIS_Manipulator源码学习

前言 AIS_Manipulator 是 OpenCASCADE 库中的一个类&#xff0c;用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式&#xff0c;使用户可以通过鼠标进行平移、缩放和旋转等操作。 详细功能 交互对象类&#xff0c;通过鼠标操控另一个交互对象…

【Django】 读取excel文件并在前端以网页形式显示-安装使用Pandas

文章目录 安装pandas写views写urls安装openpyxl重新调试 安装pandas Pandas是一个基于NumPy的Python数据分析库&#xff0c;可以从各种文件格式如CSV、JSON、SQL、Excel等导入数据&#xff0c;并支持多种数据运算操作&#xff0c;如归并、再成形、选择等。 更换pip源 pip co…

在 Postman 中设置全局 token

目录 问题描述解决方案 问题描述 在使用 Postman 进行接口测试时&#xff0c;经常会遇到在 Header 中添加 token 的情况。当接口数量较多时&#xff0c;需要为每个接口进行设置&#xff0c;而且当 token 失效时需要重新获取并设置&#xff0c;这样一来效率较低。 解决方案 下…

MSPM0G3507学习笔记1:开发环境_引脚认识与点灯

今日速通一款Ti的单片机用于电赛&#xff1a;MSPM0G3507 这里默认已经安装好了Keil5_MDK 首先声明一下: 因为是速成&#xff0c;所以需要一定单片机学习基础&#xff0c;然后我写的也不会详细&#xff0c;这个专栏的笔记也就是自己能看懂就行的目标~~~ 文章提供测试代码解…

Matlab进阶绘图第65期—带分组折线段的柱状图

带分组折线段的柱状图是在原始柱状图的基础上&#xff0c;在每组柱状图位置处分别添加折线段&#xff0c;以进行对比或添加额外信息。 由于Matlab中未收录带分组折线段的柱状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的BarwithGroupedLine小工具进行…

「Ant Design」Antd 中卡片如何完全不展示内容区域、按需展示内容区域、不展示标题

前言 下面是默认的 Antd 卡片&#xff0c;由以下区域组成 处理 Antd 的 Card 展示形式大致有下面三种 卡片完全不展示内容区域 const App () > (<Card title"Default size card" extra{<a href"#">More</a>} style{{ width: 300 }}b…

SSRF过滤攻击

SSRF绕过&#xff1a; 靶场地址&#xff1a;重庆橙子科技SSRF靶场 这个是毫无过滤的直接读取&#xff0c;但是一般网站会设置有对SSRF的过滤&#xff0c;比如将IP地址过滤。 下面是常用的绕过方式&#xff1a; 1.环回地址绕过 http://127.0.0.1/flag.php http://017700…

C++11新特性——智能指针——参考bibi《 原子之音》的视频以及ChatGpt

智能指针 一、内存泄露1.1 内存泄露常见原因1.2 如何避免内存泄露 二、实例Demo2.1 文件结构2.2 Dog.h2.3 Dog.cpp2.3 mian.cpp 三、独占式智能指针:unique _ptr3.1 创建方式3.1.1 ⭐从原始(裸)指针转换&#xff1a;3.1.2 ⭐⭐使用 new 关键字直接创建&#xff1a;3.1.3 ⭐⭐⭐…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音&#xff1f;不管是娱乐圈还是现实生活&#xff0c;【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热&#xff01; 本文将为您推荐8款电脑录音软件&#xff0c;并详细介绍电脑录音的多种方式…

electron 网页TodoList工具打包成win桌面应用exe

参考&#xff1a; electron安装&#xff08;支持win、mac、linux桌面应用&#xff09; https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程&#xff1a; 要将…

51单片机-第五节-串口通信

1.什么是串口&#xff1f; 串口是通讯接口&#xff0c;实现两个设备的互相通信。 单片机自带UART&#xff0c;其中引脚有TXD发送端&#xff0c;RXD接收端。且电平标准为TTL&#xff08;5V为1,0V为0&#xff09;。 2.常见电平标准&#xff1a; &#xff08;1&#xff09;TTL电…

景区AR导航营销系统:技术解决方案与实施效益分析

随着旅游市场的竞争日益激烈&#xff0c;景区需要不断创新以吸引游客。景区 AR 导航将虚拟画面与现实场景相结合&#xff0c;为游客提供了更加直观、生动的导航服务。对于景区而言&#xff0c;这一创新技术无疑是吸引游客目光、提升景区知名度的有力武器。通过独特的 AR 导航体…

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

一款基于Cortex-M0+的单片机音频编解码 - CJC2100

USBCodec芯片可以对数字音频信号进行多种处理&#xff0c;例如增加音量、均衡调节、音效处理等。这些处理可以通过耳机的控制按钮来实现&#xff0c;让用户可以根据自己的喜好来调整音频效果。USBCodec芯片还可以控制噪声和失真的水平&#xff0c;以提供高品质的音频输出。噪声…