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()