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

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)的方法

  1. cur.scroll(1,mode='relative')表示将光标相对于原来的位置移动,正值表示向下移动,反之向上移动
  2. 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()

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

  1. 建立游标:游标名 = 连接名.cursor()
  2. 编写增删等SQL语句:sql="具体的语句"
  3. 执行:ret = 游标名.execute(sql,[sno,sname])
  4. 提交:连接名.commit()
  5. 关闭连接: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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值