连接到数据库

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. js有序数组中插入一个元素,并有序的输出

    题目:比较传入函数的参数,将参数组成数组,从小到大排序,返回新的数组. 如: insert();console.log(arr); //[] insert(-1,-2); console.log(ar ...

  2. 网卡做bond 导致丢包

    值班中发现一台服务器报到网关丢包,带宽200M. 用  ethtool bond0 查看网卡带宽信息,发现 Speed 为 3100M ,非 1000 的整数倍或10000的整数倍,感觉不对,因为是做 ...

  3. Openstack知识点总结

    Openstack: 一.云计算+openstack概念: 1.云计算是一种按使用量付费的模式,这种模式提供可用的,便捷的,按需的访问,通过互联网进入可配置的计算资源共享池(资源包括网络,计算,存储, ...

  4. 用myeclipse连接MySQL8.0时没有配置jar包

    先上测试代码 package testJdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql. ...

  5. Spring Cloud health节点通过注册中心扫描状态的简单实现

    package com.zjs.web; import com.netflix.appinfo.InstanceInfo; import com.zjs.FallbackApiApplication; ...

  6. sql次级语句

    select upper(n_id) from nrc_news;select left(n_content,1) from nrc_news;select len(n_content) from n ...

  7. 2019/5/13 洛谷P4742 【tarjan缩点 + 拓扑dp】

    题目链接:https://www.luogu.org/problemnew/show/P4742 题目大意:给一张有向图, 每个点都有点权,第一次经过该点时,该点的点权有贡献,求这张图上一条路径(终点 ...

  8. 分库分表之后,id 主键如何处理

    基于数据库的实现方案 数据库自增 id 这个就是说你的系统里每次得到一个 id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个 id.拿到这个 id 之后再往对应的分 ...

  9. Oracle如何创建索引、删除索引、查询索引

    1.创建单一索引 create index 索引名称 on 表名(列名); 2.创建复合索引 create index 索引名称 on 表名(列名1,列名2); 3.删除索引 drop index 索 ...

  10. STL pair 常见用法详解

    <算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...