利用PyMySQL模块操作数据库
连接到数据库
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模块操作数据库的更多相关文章
- 第二百七十九节,MySQL数据库-pymysql模块操作数据库
MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...
- MySQL数据库-pymysql模块操作数据库
pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connect() 参数: host=数据库ip port= ...
- pymysql模块操作数据库
pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数 使用方式: 模块名称.connect() 参数: host=数据库ip po ...
- 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库
引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...
- 调用pymysql模块操作数据库
1.创建数据库表: def create_table(tb_name): import pymysql#导入模块 #连接数据库 db = pymysql.Connect(','zabbix_db') ...
- pymysql模块操作数据库及连接报错解决方法
import pymysql sql = "select host,user,password from user" #想要执行的MySQL语句 #sql = 'create da ...
- 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库
MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...
- python 通过 pymysql模块 操作 mysql 数据库
Python 中操作 MySQL 步骤 安装模块 pip install pymysql 引入模块 在py文件中引入pymysql模块 from pymysql import * Connection ...
- python:利用xlrd模块操作excel
在自动化测试过程中,对测试数据的管理和维护是一个不可忽视的点.一般来说,如果测试用例数据不是太多的话,使用excel管理测试数据是个相对来说不错的选择. 这篇博客,介绍下如何利用python的xlrd ...
随机推荐
- c/c++编码规范(2)--作用域
2. 作用域 静止使用class类型的静态或全局变量. 6. 命名约定 6.1. 函数名,变量名,文件名要有描述性,少用缩写. 6.2. 文件命名 6.2.1. 文件名要全部用小写.可使用“_”或&q ...
- windows下安装Sonar
1.sonar安装: sonar有三部分组成: 1.服务端:显示分析结果和sonar相关配置 2.客户端:对项目运行源代码进行运算和分析 3.数据库:存储sonar配置和代码分析结果的数据库 2.so ...
- js 返回一个数组里面0出现的次数
var num = new Array(10000).fill('').map((item,index) => (index + 1)). 在点号后面补充代码,让num是这个数组中0出现的次数, ...
- intellij idea for mac 2018 破解版
下载地址:https://pan.baidu.com/s/1DNo3CvkI7EMy6Mt0hdzTpg 1.在本站下载好mac文件包,打开dmg镜像文件,将“IntelliJ IDEA”拖入到“Ap ...
- 基于SpringBoot从零构建博客网站 - 整合ehcache和开发注册登录功能
对于程序中一些字典信息.配置信息应该在程序启动时加载到缓存中,用时先到缓存中取,如果没有命中,再到数据库中获取同时放到缓存中,这样做可以减轻数据库层的压力.目前暂时先整合ehcache缓存,同时预留了 ...
- 易混乱javascript知识点简要记录
一.== vs === ==在做判断时,如果对比双方的类型不一样的话,就会进行类型转换 假如我们需要对比 x 和 y 是否相同,就会进行如下判断流程: 首先会判断两者类型是否相同.相同的话就是比大小了 ...
- dij 费用流
#include <bits/stdc++.h> using namespace std; typedef long long lld; const int MAXN = 50010, M ...
- js预解析实例
<script> // f1(); // console.log(c);//9 // console.log(b);//9 // console.log(a);//报错 // functi ...
- 从入门到自闭之Python--虚拟环境如何安装
Windows下创建虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版 ...
- 运用加密技术保护Java源代码(转)
出处:运用加密技术保护Java源代码 为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一 ...