连接到数据库

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. Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...

  2. Python把json格式的string对象转变成dict对象操作、Python3不能使用urllib2、urllib.parse.urlencode(params).encode(encoding='UTF8')

    son格式的string对象转变成dict对象操作 content=eval(content)#json字典转化 Python3不能使用urllib2 直接使用urllib.request替换urll ...

  3. JavaScript中函数文档注释

    /** 方法说明 * @method 方法名 * @for 所属类名 * @param{参数类型}参数名 参数说明 * @return {返回值类型} 返回值说明 */

  4. bg_imgae

  5. Summary of OAuth 2.0

    Summary of OAuth 2.0 1 Problems: This pattern of applications obtaining user passwords obviously has ...

  6. 《JAVA语言》第三节课

    使用递归方式判断某个字串是否是回文( palindrome ). 1. 设计思想 在判断字符串是否是回文的时,采用递归法,首先要分析出重复做的是什么事情,这里是要重复判断两端的字符是不是相等的,直到剩 ...

  7. 关于bootstrap的响应式插件respond.min.js在IE8下出现:拒绝访问。respond.min.js,行: 5,列: 746报错问题

    本地在IE8浏览器下测试兼容性的时候,出现了以下的报错: 该问题在bootstrap的官网有介绍:https://v3.bootcss.com/getting-started

  8. Shortest Distance from All Buildings

    You want to build a house on an empty land which reaches all buildings in the shortest amount of dis ...

  9. iis实现方向代理

    将请求的网址重写重定向到其它网址.当80端口被占用无法同时使用两个Web服务的解决方案,使得IIS和Apache Tomcat 共存 0|1环境 WindowServer 2008 IIS7 Apac ...

  10. 【LOJ】#2985. 「WC2019」I 君的商店

    LOJ#2985. 「WC2019」I 君的商店 一道很神仙的题啊QAQ 居然是智商题--不是乱搞或者是大数据 我们可以用2N问出一个最大值是1 然后对于任意两个值\(x + y\)和\(a\)比较 ...