连接到数据库

import pymysql
# 创建链接得到一个链接对象
conn = pymysql.Connect(
host="127.0.0.1", # 数据库服务器主机地址
user="root", # 用户名
password="root", # 密码
database="test", #数据库名称
port=3306, # 端口号 可选 整型
charset="utf8" # 编码 可选
)

和命令行一直的是是要指定IP端口,用户授权,不过用户要操作的数据库必须要在pymysql连接之前就要存在,不然就要报错。

获得游标

,类比命令行,登录命令行之后会有mysql>的提示符提示你进行操作,用代码操作数据库需要获得相应的游标,传入的pymysql.cursors.DictCursor参数是指定返回的结果是字典类型的数据,pymysql会给字典加上字典容器,最后返回的是列表,列表的元素时字典,字典的键值是对应的字段和数据

cursor = conn.cursor(pymysql.cursors.DictCursor)  # 将查询结果做成字典的格式

执行SQL语句

我们通常将sql语句放在字符串中,比如

select_sql = ""select * from table_name"" # 要在sql语句中指定数据表了,要不然查不到数据
insert_sql = "insert into table_name( name,age) values(%s,%s)"%("ruhai",18)
updata_sql = "update user set username='superamdin' where name = admin"

我们将写好的SQL语句交给cursor.execute()来执行,就相当于你把命令敲在命令行中并敲了一下回车,得到sql语句的执行结果。

cursor.execute(select_sql)
cursor.commit() # 因为pymysql 模块默认是启用事务的 你的sql语句 如果不提交 相当于没有执行

获得结果

我们用一个变量值来获得查询的结果

res = cursor.execute(select_sql)

直接打印可以得到结果的条目数

print(res)

获得具体数据

cursor.fetchone()
cursor.fetchall()

游标的移动

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 查询语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。

cursor.scroll(1,mode='relative')  # 相对当前位置移动【1:表示向下移动一行,-1:表示向上移动一行】
cursor.scroll(1,mode='absolute') # 相对绝对位置移动 【1:表示向上移动一行,-1:表示向下移动一行】

敏感信息的防护

防止sql注入

来看下面的代码

username=input()
password =input()
# 正常构造语句的情况
sql = "select user,pwd from User where user='%s' and pwd='%s'" % (username,password) row_count = cursor.execute(sql)

其实用户可以这样输入实现免帐号登录:

username: ‘or 1 = 1 –-

password:

如若没有做特殊处理,那么这个非法用户直接登陆进去了.

当输入了上面的用户名和密码,服务端的sql就变成:

sql = "select user,pwd from User where user=‘'or 1 = 1 –-' and pwd='%s'"

因为条件后面username=”or 1=1 用户名等于 空 或1=1 那么这个条件一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

使用pymysql提供的参数化语句防止注入

#执行参数化查询
row_count=cursor.execute("select user,pwd from User where user='%s' and pwd='%s'" ,(username,password))
#execute()函数本身就有接受SQL语句变量的参数位,只要正确的使用(直白一点就是:使用”逗号”,而不是”百分号”)就可以对传入的值进行correctly转义,从而避免SQL注入的发生。

数据一致性验证

小明有100块 准备给小花转50,如果这个时候突然发生了一些事情导致这个数据值存成功了一半,把小明的钱从系统中扣件掉了,但是没有给小花加上去,那么就会造成数据的不一致,这个时候应该加上容错机制提高程序的健壮性,和数据的安全。

try:
cursor.execute("update moneyTable set money = money - 50 where name = '小明'")
#如果小花的账户出问题了 无法更新数据 那就需要回滚
cursor.execute("update moneyTable set money = money + 50 where name = '小花'")
conn.commit()
except:
conn.rollback()

关闭连接

cursor.close()
conn.close()

操作数据库的完整代码

import pymysql

conn = pymysql.Connect(
host="127.0.0.1",
user="root",
password="admin",
database="day42",
port=3306,
charset="utf8"
)
cursor = conn.cursor(pymysql.cursors.DictCursor) sql = "insert into user(username,pwd) values(%s,%s)" try:
cursor.execute(sql,args= (user,name))
conn.commit()
except:
conn.rollback()
cursor.close()
conn.close()

利用PyMySQL模块操作数据库的更多相关文章

  1. 第二百七十九节,MySQL数据库-pymysql模块操作数据库

    MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...

  2. MySQL数据库-pymysql模块操作数据库

    pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connect() 参数: host=数据库ip port= ...

  3. pymysql模块操作数据库

    pymysql模块是python操作数据库的一个模块   connect()创建数据库链接,参数是连接数据库需要的连接参数 使用方式: 模块名称.connect() 参数: host=数据库ip po ...

  4. 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库

    引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...

  5. 调用pymysql模块操作数据库

    1.创建数据库表: def create_table(tb_name): import pymysql#导入模块 #连接数据库 db = pymysql.Connect(','zabbix_db') ...

  6. pymysql模块操作数据库及连接报错解决方法

    import pymysql sql = "select host,user,password from user" #想要执行的MySQL语句 #sql = 'create da ...

  7. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  8. python 通过 pymysql模块 操作 mysql 数据库

    Python 中操作 MySQL 步骤 安装模块 pip install pymysql 引入模块 在py文件中引入pymysql模块 from pymysql import * Connection ...

  9. python:利用xlrd模块操作excel

    在自动化测试过程中,对测试数据的管理和维护是一个不可忽视的点.一般来说,如果测试用例数据不是太多的话,使用excel管理测试数据是个相对来说不错的选择. 这篇博客,介绍下如何利用python的xlrd ...

随机推荐

  1. delphi 中Adoquery ,在打开时能否让记录指针不移动? [问题点数:40分,结帖人microd]

    delphi 中Adoquery ,在打开时能否让记录指针不移动?由于数据集Adoquery 时,它的针指称动会废时,能否在打开完成之前不让记录指针不移动.打开完毕之后再回复移动? 这样用:self. ...

  2. 在centos卸载mysql

    1 rpm -qa|grep mysql 查看安装了哪些mysql和lib…… 1 yum remove mysql mysql-server mysql-libs compat-mysql51 删除 ...

  3. OpenCV图像旋转

    图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸.图像旋转后图像的水平对称轴.垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换. 如下图: 假 ...

  4. bash-1 初始化CentOS系统的初始化脚本

    初始化CentOS系统的初始化脚本 #!/bin/bash # #******************************************************************* ...

  5. python基础知识(属性property)

    属性property property               !=          类属性和实例属性 访问计算后所得的值           返回所存储的值 创建用于计算的属性 @proper ...

  6. 无法从路径’NuGet.CommandLine.2.7.1.nupkg’读取包

    visual-studio-2010或者2013 – 在启用Nuget包恢复时出现奇怪的Nuget错误 我右键单击我的VS2010中的解决方案文件并单击Enable NuGet Package Res ...

  7. Sql 语句收集——行转列

    SQL行转列汇总 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in ...

  8. 第12课.经典问题解析(const;指针和引用)

    问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...

  9. JSP基础知识补充

    <meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Cac ...

  10. [转帖]兆芯发布国产X86处理器KX-6000和KH-30000,性能提升达50%,附详情介绍

    兆芯发布国产X86处理器KX-6000和KH-30000,性能提升达50%,附详情介绍 2019-06-20 09:56:38作者:linux人稿源:快科技 https://ywnz.com/linu ...