二十七、用pymysql操作数据库中的数据简介

mac2025-08-31  20

1、查询数据

一次查询一条记录——fetchone()

fetchone()函数: 若数据库中已无记录,则返回None 实例:

conn = pymysql.connect( host='localhost', user='root', database='mysq', password='password', port=3306, charset='utf8' ) cur = conn.cursor() sql = 'select * from stuta' #查询所有数据 res = cur.execute(sql) result_one = cur.fetchone() #获取一个信息,并且以元组的形式返回 result_one = cur.fetchone() #获取二个信息,并且以元组的形式返回 ... cur.close() conn.close()

查询一次多条记录——fetchmany()

fetchmany()函数: fetchmany(size)方法是一次查询多条记录并以元组形式返回,其中size指查询的最多记录数,若已无记录,则无任何消息显示;对于fetchmany()中的参数size如果小于0,则表示去掉size个之后的结果;如果大于0,则表示一次最多查询多少个结果。 实例:

cur = conn.cursor() sql = 'select * from stuta' #查询所有数据 res = cur.execute(sql) result_many = cur.fetchmany(3) #一次查询最多3条记录,并以元组形式返回 print(result_many) cur.close() conn.close()

一次查询所有记录——fetchall()

fetchall()函数: 查询所有记录,并以元组形式返回 实例:

cur = conn.cursor() sql = 'select * from stuta' #查询所有数据 res = cur.execute(sql) result_all = cur.fetchall() print(result_all) cur.close() conn.close()

附: 由于返回的是元组,可以将其转为列表,具体语法如下:

#再定义游标时作如下设置: conn.cursor(cursor=pymysql.cursors.DictCursor)

其返回的是一个列表,列表中包含一个字典;实例:

cur = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from stuta' #查询所有数据 res = cur.execute(sql) result_all = cur.fetchall() print(result_all) cur.close() conn.close()

注: 移动游标(cursor)的方法

cur.scroll(1,mode='relative')表示将光标相对于原来的位置移动,正值表示向下移动,反之向上移动cur.scroll(1,mode='absolute')表示相对于起始位置进行移动,其中移动距离不能为负

2、pymysql对mysql数据库的增删改操作

相比于查询的步骤,对数据库的增删改操作主要是多了一个提交(commit)的步骤; 实例:

#前面导入模块和建立连接的过程省略。 sno = input() sname = input() cur = conn.cursor() sql = 'insert into stuta(sno,sname) values (%s,%s)' res = cur.execute(sql,[sno,sname]) #这里是为了防止SQL注射攻击所以不采用拼接字符串的方法编写SQL语句,而是在执行的函数里面再将值传送进去。 conn.commit()#增删改操作一定要加入此句,或者说用commit()方法进行提交,如果不提交,数据库中真正的数据是不变的 cur.close() conn.close()

从上例可以看出,其基本流程如下:

建立游标:游标名 = 连接名.cursor()编写增删等SQL语句:sql="具体的语句"执行:ret = 游标名.execute(sql,[sno,sname])提交:连接名.commit()关闭连接:cur.close()及conn.close()

附:pymysql防止SQL注入攻击

方法一:使用模块提供的参数化语句,如下:

import pymysql conn = pymysql.connect( host='localhost', user = 'root', database='db_name', password='pwd', port=3306, charset='utf8' ) # 编写SQL语句:注意,此处只能为%s,不能写成%d等形式,否则会报错 sql = "select * from account where 序号=%s or 序号=%s" # 创建游标 cur = conn.cusor(cursor=pymysql.cursors.DictCursor) # 将SQL的参数作为execute函数的参数传进去,有多个参数时,以元组的形式传递即可 data_id1 = 1 data_id2 = 2 ret = cur.execute(sql,(data_id1,data_id2)) # 查询结果 result = cur.fetchall() # 输出结果 print(result) # 关闭连接 cur.close() conn.close()

方法二:在数据库中创建存储过程,然后调用callproc方法

import pymysql conn = pymysql.connect( host='localhost', user = 'root', database='db_name', password='pwd', port=3306, charset='utf8' ) # 编写SQL语句 sql = "select * from account where 序号=? or 序号=?" # 创建游标 cur = conn.cursor(cursor=pymysql.cursors.DictCursor) # 调用callproc方法 data_id1 = 1 data_id2 = 2 # 需要注意的是,如果存储过程名涉及到了数据的增删改,则依然需要调用commit方法进行提交,否则针对数据库来说,提交无效,表中数据不做更改 cur.callproc('存储过程名',args=(data_id1,data_id2,sql)) ret = cur.fetchall() # 关闭连接 cur.close() conn.close()
最新回复(0)