MySQL:游标 cursor 句柄

当我们select * from emp 可以查看所有的数据  这个数据就相当于一个数据表

游标的作用相当于一个索引 一个指针 指向每一个数据 

假设说我要取出员工中薪资最高的前五名成员 就要用到limit关键字 但是这样太麻烦了 

所以这里用到了游标

游标的声明:

        declare my_cursor cursor for select * from emp;

        这样就是相当于取出来emp表 然后加上了一个 索引

想要用我当前游标指向的这个数据 :

先打开 里面操作 然后关闭

open my_cursor;

        *****

close cursor;

****这里面可以用到 语句:fetch my_cursor into ***(自己声明的一个变量,存储fetch来的数据)

如果我想要循环取里面的数据  当最后结束的时候  要跳出循环 

这个时候就可以用到句柄

declare continue handler for not found set flag=0;

可以continue表示继续执行 for后面not found表示原因 set还能赋值

当我同时用到游标和句柄的时候 要注意一些顺序:

1.声明变量

2.声明游标

3.声明句柄

下面是一个例子,供大家参考:

        

<think>嗯,用户这次想了解数据库操作中cursor的具体用法,从上下文看可能是在Python环境中操作数据库。之前讨论过MCP协议,但用户当前问题已经转向数据库操作,需要切换焦点。用户提供的三个引用都围绕Python中cursor对象的用法:[^1]是基本连接操作,[^2]展示达梦数据库专用语法,[^3]则解释cursor的迭代器特性。综合来看,用户需要的不是协议层知识,而是实用的、语言级别的操作指导。注意到引用[^3]特别强调cursor的“一次性”特性——像生成器那样耗尽后不可复用,这点在写循环时容易出错,应该重点说明。另外用户提到的达梦数据库示例显示不同数据库驱动可能有特殊属性(如execid),需要区分通用语法和数据库特定扩展。准备用“连接-执行-获取-关闭”的四步框架组织答案,在fetch阶段重点解释:1.迭代器特性(为什么不能重复遍历)2.内存管理(fetchall()的风险)3.事务控制(特别强调DML需要commit)还要提醒两个易错点:游标作用域管理(with语句用法)和不同数据库驱动的参数差异。示例代码需要覆盖三种场景:基础查询(展示fetchone循环)、参数化查询(防注入)、上下文管理器使用。考虑到用户可能不熟悉数据库连接流程,连接部分也给出简单示例。安全方面必须强调参数化查询,引用[^2]正好有execid这种非标准属性,可以单独说明兼容性问题。</think> 以下是如何在数据库中使用Cursor对象进行操作的完整指南,结合Python实现示例和关键注意事项: ### 一、Cursor操作核心步骤 1. **建立数据库连接** ```python import psycopg2 # PostgreSQL示例(其他数据库MySQL/SQLite类似) connection = psycopg2.connect( host="localhost", database="mydb", user="postgres", password="secret" ) cursor = connection.cursor() # 创建Cursor对象 [^1][^3] ``` 2. **执行SQL操作** - **查询操作**(需获取结果) ```python cursor.execute("SELECT * FROM employees WHERE department=%s", ('IT',)) # 参数化防SQL注入 [^2] ``` - **数据修改操作**(INSERT/UPDATE/DELETE) ```python cursor.execute("UPDATE products SET price=%s WHERE id=%s", (19.99, 1001)) connection.commit() # 必须显式提交事务 [^1] ``` 3. **获取查询结果** ```python # 方法1:逐行获取(内存高效) for row in cursor: # Cursor是迭代器 [^3] print(f"员工ID: {row[0]}, 姓名: {row[1]}") # 方法2:批量获取 cursor.execute("SELECT * FROM orders LIMIT 100") first_row = cursor.fetchone() # 获取单行 next_ten = cursor.fetchmany(10) # 获取10行 all_data = cursor.fetchall() # 获取剩余所有行(慎用大数据) [^3] ``` 4. **关闭资源** ```python cursor.close() # 关闭游标释放资源 connection.close() # 关闭数据库连接 [^1] ``` ### 二、关键技术细节 1. **游标特性** - **单向迭代**:遍历后无法回退(类似生成器),重复遍历需重新执行查询 [^3] - **状态属性**: ```python print(cursor.rowcount) # 显示受影响/返回的行数 print(cursor.description) # 返回列名和类型信息 [^2] ``` 2. **事务控制** ```python try: cursor.execute("INSERT INTO logs (message) VALUES (%s)", ('系统启动',)) cursor.execute("UPDATE status SET running=1") connection.commit() # 同时提交两条SQL except Exception: connection.rollback() # 出错时回滚 [^1] ``` 3. **安全实践** ```python # 危险:直接拼接字符串(SQL注入风险) cursor.execute(f"SELECT * FROM users WHERE name='{user_input}'") # 安全:参数化查询 cursor.execute("SELECT * FROM users WHERE name=%s", (user_input,)) [^2] ``` ### 三、最佳实践 ```python # 使用上下文管理器(自动关闭资源) with psycopg2.connect(...) as conn: with conn.cursor() as cur: # Python 3.0+ 支持 cur.execute("SELECT ...") for record in cur: process_data(record) # 此处conn自动commit(若未关闭自动回滚) [^1][^3] ``` > **达梦数据库特殊属性** > 达梦的cursor额外提供执行跟踪功能: > ```python > cursor.execute("SELECT * FROM dm_table") > print(f"当前SQL执行ID: {cursor.execid}") # 达梦特有属性 [^2] > ``` **关键总结**: 1. 游标是**数据库操作的执行句柄**,生命周期应短于连接 2. 修改操作后必须`commit()`,查询操作用迭代方式处理结果集 3. 参数化查询是**防范SQL注入**的核心手段 4. 游标遍历后不可重置,大数据集避免`fetchall()` [^3] --- ### 相关问题 1. **如何优化游标查询百万级数据时的内存占用?** *(涉及分页查询/服务端游标/流式处理)* 2. **不同数据库MySQL/PostgreSQL/SQLite)的游标操作有何差异?** *(对比事务行为/参数化语法/特性支持)* 3. **为什么在Web应用中不能长期持有数据库游标?** *(分析连接池冲突与资源泄漏风险)* 4. **如何通过游标实现数据库批量插入优化?** *(示例`cursor.executemany()`与COPY命令对比)* [^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值