游标对象  2019/1/24

就是对数据库进行具体的操作了,比如增、删、改、查等等一系列操作都可以完成

1.游标类型:

类型 描述
Cursor 普通的游标对象,默认创建的游标对象
SSCursor 不缓存游标,主要用于当操作需要返回大量数据的时候
DictCursor 以字典的形式返回操作结果
SSDictCursor 不缓存游标,将结果以字典的形式进行返回
class pymysql.cursors.Cursor(connection)#游标结果作为元祖的元祖返回
说明:
这是您用于与数据库交互的对象。
不要自己创建Cursor实例。调用connections.Connection.cursor()class pymysql.cursors.SSCursor(connection)#无缓冲游标结果作为元祖的元祖返回,
用途:
用于返回大量数据查询,或慢速网络连接到远程服务器不将每行数据复制到缓冲区,根据需要获取行。客户端内存使用少
在慢速网络上或结果集非常大时行返回速度快限制:
MySQL协议不支持返回总行数,判断有多少行唯一方法是迭代返回的每一行。
目前无法向后滚动,因为只有当前行保存在内存中。class pymysql.cursors.DictCursor(connection) #将结果作为字典返回游标
class pymysql.cursors.SSDictCursor(connection)#无缓冲游标结果作为字典返回

2.游标属性: 只读

# PEP 249 - Python数据库API规范v2.0 name #必需
 type_code#必需
 display_size
 internal_size
 precision
 scale
 null_okcursor.description#返回游标活动状态 #(('VERSION()', 253, None, 24, 24, 31, False),)
包含7个元素的元组:
(name, type_code, display_size, internal_size, precision, scale, null_ok)

游标属性:

cursor.max_stmt_length#1024000
cursor.rownumber#5 #当前结果集中游标所在行的索引(起始行号为 0)cursor.arraysize#1 #此读/写属性指定用.fetchmany()一次获取的行数。
# 默认1表示一次获取一行;也可以用于执行.executemany()cursor.lastrowid#None #只读属性提供上次修改行的rowid
# DB仅在执行单个INSERT 操作时返回rowid 。
# 如未设rowid或DB不支持rowid应将此属性设置为None
# 如最后执行语句修改了多行,例如用INSERT和.executemany()时lastrowid语义是未定义cursor.rowcount #5 #最近一次 execute() 创建或影响的行数
# 如无cursor.execute()或接口无法确定最后一个操作的rowcount则该属性为-1
# 该行数属性可以在动态更新其值的方式来编码。
# 这对于仅在第一次调用.fetch()方法后返回可用rowcount值的 数据库非常有用。

3.游标方法:连接关闭

 cursor.connection()#创建此游标对象的数据库连接cursor.close()         #关闭此游标对象

3.11方法:查询

cursor.excute(query,args = None)#执行数据库操作(查询或命令)参数:
query:str 表示要执行的SQL语句
args:(元组,列表或字典) - 与查询一起使用的参数。用于给SQL传入参数,是可选的。
返回:
int受影响的行数
注意:
# 如args是列表或元组用%s作为SQL 语句中的占位符,args是dict用%(name)s作为占位符。
# 重复操作最好用.setinputsizes()提前指定参数类型和大小。参数与预定义信息不匹配是合法的;
# 参数也可为元组列表,如在单个操作中插入多行,不推荐:应用.executemany()

实例:#Cu_table表中的id字段中插入数据

str_insert= "INSERT INTO Cu_table (id) VALUES (%s)"# 参数是元组时
cursor.execute(str_insert,('123'))arg = {'id':'id'}# 参数是字典时
str_insert= "INSERT INTO Cu_table (id) VALUES (%(id)s)"
cursor.execute(str_insert,arg)

3.12方法:查询

cursor.excutemany(query, args)#执行多个数据库查询或命令
参数:
query - 要在服务器上执行的查询
args - 序列或映射的序列。它用作参数。
返回:
受影响的行数(如果有)
说明:
提高多行INSERT和REPLACE的性能。否则它等同于使用execute()循环遍历args
executemany()生成的最大语句大小为max_allowed_pa​​cket - packet_header_size
cursor.max_stmt_length #1024000
con.max_allowed_packet#16777216
实例:
str_insert = "INSERT INTO Cu_table (id) VALUES (%s)"
cursor.executemany(str_insert,['A','B','C','D']) #一次插入A B C D 四个值

3.21方法:获取结果

cursor.fetchone()#获取查询结果的下一行
返回:
单个序列元祖或None
实例:
str_insert = "SELECT * FROM Cu_table"
cursor.execute(str_insert)
result = cursor.fetchone()
print(result)

3.22方法:获取结果

cursor.fetchmany(size=None)#获取查询结果前size行,默认cursor.arraysize=1行
返回:
序列的序列(例如元组的元祖)
实例:
str_insert = "SELECT * FROM Cu_table"
cursor.execute(str_insert)
result = cursor.fetchmany(3) # 获取前三行
print(result)

3.23方法:获取结果

cursor.fetchall()#获取所有查询的结果行
返回:
序列的序列(例如元组的元祖)
说明:
对于大型查询来说,它是无用的,因为它是缓冲的
实例:
str_insert = "SELECT * FROM Cu_table"
cursor.execute(str_insert)
result = cursor.fetchall()
pd.DataFrame(list(result))

注意:如fetchall(),fetchmany(),fetchone()同时作用于同一个查询时,每个方法执行开头是上一个方法执行的结尾

也就是说,如果前面执行了fetchall()方法,后面执行的fetchmany()或fetchone()方法是获取不到结果。
比如:str_insert = "SELECT * FROM Cu_table"
cursor.execute(str_insert )
result = cursor.fetchall()
print(result) # 这里会输出所有结果。。。
result = cursor.fetchone()
print(result) # None
result = cursor.fetchmany(3)
print(result) # ()
3.24方法:迭代获取结果
cursor .__iter__()#创建一个可迭代对象(可选)
实例:
cursor.execute("SELECT * FROM new_futures.m1809")
it=cursor.__iter__()
it.__next__()#获取结果集的下一行返回元祖
pd.DataFrame(list(it))
3.3方法:调用函数 
cursor.callproc(procname, args=())#调用数据库中的存储过程
参数:procname表示数据库中存储过程的名字,args表示为存储过程传入的参数。
返回:返回原始args调用的结果作为输入序列的修改副本返回。该过程还可以提供结果集作为输出。然后必须通过标准.fetch *()方法使其可用调用无参数存储过程:cursor.callproc('p2') #等价cursor.execute("call p2()")
调用有参数存储过程:cursor.callproc('p1', args=(1, 22, 3, 4))
3.4方法:nextset()    
cursor.nextset()#移到下一个结果集(如果支持的话)当前集中丢弃任何剩余行
# 如没有更多集返回None。否则返回true,后续对.fetch () 方法的调用将返回下一个结果集中的行 

3.5方法: scroll

cursor.scroll(value [,mode ='relative' ])#根据模式将结果集中的光标滚动到新位置# 如果mode是relative(默认值),则将值作为结果集中当前位置的偏移量,# 如果设置为absolute,则value表示绝对目标位置。#  cursor.scroll(1,mode='relative')  # 相对当前位置移动#  cursor.scroll(2,mode='absolute') # 相对绝对位置移动
3.6方法:mogrify转换字符串    
cursor.mogrify(query, args=None)#通过调用execute()方法返回发送到数据库的确切字符串作用:转换,把SQL语句和参数相结合,对其中特殊字符进行加\转义,然后返回一个execute()方法发送到数据库确切执行的字符串,避免注入语句生成。 实例1:str_query= "DELETE FROM Cu_table WHERE id=%s AND name=%s"
stri = cursor.mogrify(str_query,["u1' or '1'-- ","Tom"])
print(stri)
# DELETE FROM Cu_table WHERE id='u1\' or \'1\'-- ' AND name='Tom'实例2:# INSERT INTO m1809(No,open, close) VALUES (5,2881,2882), (6,2883,2884);数据库插入
args = [(5,2881,2882), (6,2883,2884)]
args_str = ','.join(cursor.mogrify("%s", (x, )) for x in args)#'(5,2881,2882),(6,2883,2884)'
cursor.execute("INSERT INTO m1809(No,open, close) VALUES "+args_str) 
实例3:    
实例3:pymysql库
args_str = cursor.mogrify("%s", 'datadir')
cursor.execute('show global variables like'+args_str)
cursor.fetchall()# [{'Variable_name': 'datadir', 'Value': 'D:\\Future_Data\\'}]会出现警告
用mysql.connector 创建一个连接再次运行ok    
import mysql.connector  as mysqlcon
db_name='new_futures'con = mysqlcon.connect(host = "127.0.0.1",user = "root",password = "root", database = db_name,charset = 'utf8mb4')cursor = con.cursor()#获取游标cursor.execute('show global variables like "%datadir%"')cursor.fetchall()#[('datadir', 'D:\\Future_Data\\')]
3.7方法:设置    
cursor .setinputsizes(sizes)#预定义操作参数的内存区域;调用.execute ()之前使用# sizes被指定为一个序列 - 每个输入参数一个项目。该项应该是与将要使用的输入对应的Type对象,# 或者应该是指定字符串参数的最大长度的整数。如果该项为 None,则不会为该列保留预定义的内存区域# (这对于避免大输入的预定义区域很有用)。实现可以自由地使用此方法,用户可以不使用它cursor .setoutputsizes(sizes[,col])#为大列的提取设置列缓冲区大小(如LONG,BLOB等)。# 该列被指定为结果序列的索引。不指定列将为游标中的所有大列设置默认大小。# 调用.execute ()之前使用;实现可以自由地使用此方法,用户可以不使用它 

4设置数据返回的类型:

默认获取的数据是元祖的元祖类型,更改为字典类型#方式1:pymysql.connection()中指定参数
conn = pymysql.connect(host = "127.0.0.1",user = "root",password = "root",database = "new_futures",charset = 'utf8',cursorclass = pymysql.cursors.DictCursor)#方式2:conn.cursor()中指定参数
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)pd.DataFrame(list(rs))#rs为元祖:((1, '豆粕1','m1809',),(2,'豆粕2','m1809',),...,(...))
pd.DataFrame(rs1)    #rs1为字典:[{'No': 1,'name': '豆粕1','code': 'm1809'},{...}]

5.传入变量参数的方法:

import pymysql
con=pymysql.connect( host='localhost',user='root',password='root',database='new_futures')
cursor=con.cursor() 

5.1格式1:仅仅传入数值

5.1.1参数是元组
#必须加括号,只能是(%s)格式;   参数必须是(str,)# 实例1.1.1:一个参数
str_insert= "INSERT INTO m1805 (id) VALUES (%s)"# 只能是(%s)格式
cursor.execute(str_insert,('7'))                                        #必须加括号必须是字符串
con.commit()# 实例1.1.2:多个参数
str_insert= "INSERT INTO m1805 (id,name) VALUES (%s,%s)"# 只能是(%s)格式
cursor=con.cursor()
cursor.execute(str_insert,('123','Jim'))#必须加括号必须是字符串
con.commit()

5.1.2参数是字典

#必须加括号包括,只能是%(字典键名)s格式;   参数必须是字典#实例1.2.1:
arg = {'x':'33'}
str_insert= "INSERT INTO m1805 (id) VALUES (%(x)s)"
cursor.execute(str_insert,arg)
con.commit()#实例1.2.2:
arg = {'x':'44','y':'Bob'}
str_insert= "INSERT INTO m1805 (id,name) VALUES (%(x)s,%(y)s)"
cursor.execute(str_insert,arg)
con.commit()  
5.2格式2:传入变量  
# 实例2.1:传入变量到语句%s+传入数值到(%s) cursor.execute(后面必须加括号)table_name='m1805';id1='id';name='name';id_v='55';name_v='Smith'
str_insert= "INSERT INTO %s (%s,%s) "%(table_name,id1,name)#传入变量
str_insert=str_insert+"VALUES (%s,%s)"# 传入变量的数值;必须分开写,佛则会把变量值当成列或表名寻找,最后报错cursor.execute(str_insert,(id_v,name_v))#必须加括号必须是字符串
con.commit()# 实例2.2:传入变量到语句%s+传入数值到语句'%d','%s'分开书写table_name='m1805';id1='id';name='name';id_v=66;name_v='Smith'
str_insert= "INSERT INTO %s (%s,%s) "%(table_name,id1,name)
str_insert=str_insert+"VALUES ('%d','%s')"%(id_v,name_v)#注意 ('%d','%s')不同于上面,这样书写会将变量解析为指定的类型cursor.execute(str_insert)
con.commit()# 实例2.3.1:传入变量到语句%s +传入数值到语句'%d','%s'合并书写
table_name='m1805';id1='id';name='name';id_v=77;name_v='Smith'
str_insert= "INSERT INTO %s (%s,%s)  VALUES ('%d','%s')"%(table_name,id1,name,id_v,name_v)cursor.execute(str_insert)
con.commit()# 实例2.3.2:综合运用
#日期以字符串形式传入
table_name='m1805';id1='id';name='name';id_v=88;name_v='Smith';
date='2019-1-27';time='12:05:05'
str_insert= "INSERT INTO %s (%s,%s,%s,%s)  VALUES ('%d','%s','%s','%s')"%(table_name,id1,name,'date','time',id_v,name_v,date,time)cursor.execute(str_insert)
con.commit() 

# 实例2.4:错误的用法

table_name='m1805';id1='id';name='name';id_v=88;name_v='Smith';date='2019-1-27';time='12:05:05'
str_insert= "INSERT INTO '%s' ('%s','%s')  VALUES ('%d','%s')"%(table_name,id1,name,id_v,name_v)
str_insert=cursor.mogrify(str_insert)
print(str_insert)#cursor.execute(str_insert)#
#con.commit()
'''''''''
INSERT INTO 'm1805' ('id','name')  VALUES ('88','Smith')
''' 

4.pymysql .cursor属性方法(tcy)相关推荐

  1. cursor属性(cursor属性hand)

    Oracle中如何用ForLoop替代Cursor? 我们在Oracle存储过程中需要遍历一张表,应该怎样做.我想大多少的人第一个念头就是Cursor. create or replace proce ...

  2. mysql fetchall获取不到数据_解决pymysql cursor.fetchall() 获取不到数据的问题

    1.之前的写法(不报错): data = cursor.fetchall() data_name = data[0]['task_type'] 2.简洁的写法(报错): data = cursor.f ...

  3. 鼠标箭头样式改变和cursor属性

    要在鼠标移动到元素上方时改变鼠标样式,您可以使用内联方法结合JavaScript的onmouseover事件和CSS的cursor属性来实现. <div id="myDiv" ...

  4. ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries......

    2015年6月17日 ECMAScript 6发布正式版本 前面介绍基本语法,  后面为class用法及属性方法.set.symbol.rest等语法. 一.基本语法:  1.         定义变 ...

  5. ASP.NET基础教程-DataTable类对象-属性方法和事件

    DataTable类对象可以表示表格,也可以在DataSet中存储多个DataTable对象. 该对象的属性方法和事件列表如下: 转载于:https://blog.51cto.com/chenxing ...

  6. js如何操作表格(常用属性方法汇总)

    js如何操作表格(常用属性方法汇总) 一.总结 一句话总结: 二.表格相关的属性和方法 1.1 Table 对象集合 cells[] 返回包含表格中所有单元格的一个数组. 语法:tableObject ...

  7. 一个用户实体应该有它自己的实体验证,即一个实体应该有它的属性,方法,扩展属性及验证机制组成...

    一个存储验证信息的公用类: /// <summary>      /// 验证信息实体类      /// </summary>      public class RuleV ...

  8. 静态方法、类方法、属性方法

    静态方法:通过加@staticmethod实现,只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. class Person(object):@staticmethoddef per ...

  9. python删除类方法_python中向类中动态添加新特性及删除属性方法

    class Foo(object): pass obj = Foo() # 添加对象属性(对象名追加对象属性) obj.a = 100 # print(obj.a) # 添加类属性(类名称追加类属性) ...

最新文章

  1. python 中super方法的调用
  2. python中的大数据品牌运营专业公司_国内最好的专业数据分析公司有哪些?
  3. 【转】CT基本概念(必须掌握)!!!!!!!!!!!!!!
  4. 质量属性效用树例子_数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇
  5. 详细讲解委托和协议、看了这个我顿悟--很经典!
  6. 在手动安装 Kubernetes 的基础上搭建微服务
  7. Microsoft Office 2010 中的 Office 检测到此文件有问题
  8. 纯js实现数据导出excel表格
  9. 增强型绿植植被指数_辽宁省增强型植被指数EVI
  10. MAC安装Charles破解版简易教程
  11. servlet003:监听器
  12. 如何成为优秀的驱动开发工程师
  13. 【samba】Wodows同步Linux文件|搭建共享文件服务器——在windows上映射网络驱动器...
  14. Python super(钻石继承)
  15. Linq to sql 求和操作
  16. hbuilder边框代码是什么_HBuilder CSS 自定义代码块
  17. 国密算法SM2实现 vue+C#
  18. 站群教程SEO推广(SEO教程)
  19. cf反恐穿越前线java,穿越前线反恐使命
  20. 宜春学院计算机分数,宜春学院2019录取分数线预测

热门文章

  1. php中文日期转成date类型,php怎么将含中文的日期转为时间戳
  2. 趋势科技2014年暑期实习生笔试题
  3. 2019年趋势科技校园招聘-附内推码(社招的可以私我)
  4. 支持三个cpu的服务器,产品技术-新华三发布搭载英特尔第三代可扩展处理器的H3C UniServer R6900 G5 服务器-新华三集团-H3C...
  5. 误删系统rpc服务器不可用,rpc服务器不可用,小编教你rpc服务器不可用怎么办
  6. Python基础一(介绍)
  7. 虚拟内存太低怎么办?
  8. 计算机端口怎么配置波特率,PLC波特率设置
  9. 小波变换(wavelet transform,WT)
  10. 黑马程序员——OC 基础:NSString的一些用法