python_day16_pythom-mysql-API
16、py_mysql操作
pymysql 是python中操作mysql的模块,其使用方法和py2的mysqldb几乎相同
16.1、pymysql模块安装
1. pip install pymysql
16.2、使用
16.2.1、导入模块
import pymysql
conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='xiong',db='s1')
# 获取流标信息
cursor=conn.cursor()ret=cursor.execute("select * from students")
print(ret) // 只会返回一共有多少行信息# 操作见下方,每次操作完都需要提交,养成好习惯操作完就给连接关闭.# 提交
conn.commit()// 关闭连接以及游标
conn.close()
cursor.close()2、SQL注入查询SQL注入问题1. SQL语句在程序中是字符串,动态拼接的字符串,拿用户输入的内容去拼接字符串2. 不要自己拼接字符串
import pymysql# mysql> create table userinfo(id int primary key auto_increment,user varchar(20) unique key, passwd varchar(20) );
# mysql> insert into userinfo (user,passwd) values ("xiong","123");user = input("请输入用户名: ")
passwd = input("请输入密码: ")conn = pymysql.connect(host="127.0.0.1",port=3306,user="test",password="test",database="test",charset="utf8",
)# 获取光标
cursor = conn.cursor()sql = "select * from userinfo where user=%s and passwd=%s"ret = cursor.execute(sql, [user,passwd])if ret:print("登陆成功")
else:print("登陆失败")cursor.close()
conn.close()提示: 如果sql是字符串拼接的,那么用户在输入名称 比如 xiong ' -- 执行时就会直接执行 select * from userinfo where user='xiong' 后面的and就会被注释,这样就能直接登陆成功,因为返回的直接为true这里我们可以直接使用 pymysql execute让它自动拼接,避免因为用户输入而造成的SQL注入的问题
16.2.2、插入一个表
// 原生sql语句create table
sql_cmd="CREATE TABLE pysql(id INT PRIMARY KEY auto_increment,name VARCHAR (25))"
cursor.execute(sql_cmd)# 查看mysql
MariaDB [s1]> show tables;+--------------+| Tables_in_s1 |+--------------+| pysql || students || teachers |+--------------+
16.2.2.1、插入数据
// 原生sql语句 insert
insert_cmd="insert into pysql VALUES (1,'xiong1'),(2,'xiong2'),(3,'xiong3'),(4,'xiong4')"
cursor.execute(insert_cmd)# 查看mysql
MariaDB [s1]> select * from pysql;+----+--------+| id | name |+----+--------+| 1 | xiong1 || 2 | xiong2 || 3 | xiong3 || 4 | xiong4 |+----+--------+4 rows in set (0.00 sec)
16.2.2.2、lastrowid
获取插入数据库的最后一行的ID号
# 创建一个数据库
# MariaDB [(none)]> create database test;
# 创建一个标题表 包含标题名称跟ID号
# MariaDB [test]> create table title (id int primary key auto_increment, name varchar(20));
# 创建属性内容表 包含标题表的ID 作者消息 内容等
# MariaDB [test]> create table attribute (id int primary key auto_increment, name varchar(20), tid int);import pymysqlconn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="xiong",database="test",charset="utf8"
)# 光标位置
cursor = conn.cursor()# sql
ti1 = "insert into title (name) values (%s)"
at1 = "insert into attribute (name,tid) values (%s,%s)"cur1 = cursor.execute(ti1, 'hello world')
# 获取上面插入数据的ID
lastid = cursor.lastrowid
cur2 = cursor.execute(at1,["xiong",lastid])# 增加操作 需要使用数据库建立的连接提交事务
conn.commit()# 操作完之后,就关闭连接
cursor.close()
conn.close()
16.2.2.3、批量插入
# 新建一个用于批量增加数据的表
# MariaDB [test]> create table batchInsert (id int primary key auto_increment, name varchar(20), addr varchar(20));import pymysqlconn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="xiong",database="test",charset="utf8"
)cursor = conn.cursor()
sql = "insert into batchInsert (name,addr) values (%s,%s)"
# 这里需要可迭代的对象,必须是一个列表 或元组
tableList = [('xiong','sh'),("x2","bj"),("x3","hn")]
cursor.executemany(sql,tableList)conn.commit()
cursor.close()
conn.close()
16.2.3、查看行数据
对象:fetchone, fetchall, fetchmany
# 需要先查询数据库,然后在进行查询数据库,如果没有先查,那么一定会报错,实测
**cursor.execute("select * from pysql")**# 一次只查询一行
print(cursor.fetchone()) #(1, 'xiong1')# fetchmany(nums) 选择一次查看多少行,
# 从第2行开始是因为流标现在就定在第二行的位置上
print(cursor.fetchmany(3)) # ((2, 'xiong2'), (3, 'xiong3'), (4, 'xiong4'))# 查询所有的行 因为总行数只有4行 而流标已经到了最后一行了
print(cursor.fetchall()) #()
16.2.4、scroll
// 位置 relative (当前) ,absolute(起始)
# relative
print(cursor.fetchmany(2)) #((1, 'xiong1'), (2, 'xiong2'))
# 相对当前流标位置移动 从如上面游标已经在第2个了 +1就是第3个,打印下一条就是第4行数据
cursor.scroll(1,mode="relative")
print(cursor.fetchone()) # (4, 'xiong4')# absloute
print(cursor.fetchmany(3)) # ((1, 'xiong1'), (2, 'xiong2'), (3, 'xiong3'))
# 从第1个开始,只能是正数,不能是负的.当前为1 +1也就是从第2个开始
cursor.scroll(1,mode="absolute")
print(cursor.fetchmany(2)) # ((2, 'xiong2'), (3, 'xiong3'))
16.2.5、字典形式查看
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) 设置成这个打印方式以字典形式展示
16.3 事务
16.3.1、sql事务
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败.
MariaDB [s1]> create table salary(id int primary key auto_increment,name varchar(30),sala double)
MariaDB [s1]> insert into salary values (1,'xiong',5555.55),(2,'yy',3333.33)
start TRANSACTION; --开启事务-- 修改表,当事务没有commit的时候,数据是不会有所更改的
MariaDB [s1]> update salary set sala=sala-1000 where name='xiong';-- 回退到上一次事务提前的时候,提交未存储的事务
MariaDB [s1]> rollback;-- 保留点
MariaDB [s1]> savepoint
16.3.2、pymysql事务
自带事务功能,如果不提交commit那么修改也是无效的.
提交前的数据MariaDB [s1]> select * from salary;+----+-------+---------+| id | name | sala |+----+-------+---------+| 1 | xiong | 3555.55 || 2 | yy | 6333.33 |+----+-------+---------+
2 rows in set (0.00 sec)import pymysqlconnect=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='xiong',db='s1')# 获取游标
curosr = connect.cursor()try:# 更新id1的总数,然后查询如果小于0就退出到Exception并回滚curosr.execute("update salary set sala=sala-1000 WHERE id=1")curosr.execute("select sala from salary where id=1")if curosr.fetchall()[0][0] <0:raise Exception# 上面没有出错那么就更新这条就提交curosr.execute("update salary set sala=sala+1000 WHERE id=2")connect.commit()
except Exception:connect.rollback()connect.commit()
curosr.close()
connect.close()修改之后的数据
MariaDB [s1]> select * from salary;+----+-------+---------+| id | name | sala |+----+-------+---------+| 1 | xiong | 2555.55 || 2 | yy | 7333.33 |+----+-------+---------+2 rows in set (0.00 sec)### 最后当小于1000的时候,在怎么提交也是会直接报错。
16.3.3、事务特性
原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):事务前后数据的完整性必须保持一致
隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
将数据库设计为串行化程的数据库,让一张表在同一时间内只能有一个线程来操作。如果将数据库设计为这样,那数据库的效率太低了。所以数据库的设计这没有直接将数据库设计为串行化,而是为数据库提供多个隔离级别选项,使数据库的使用者可以根据使用情况自己定义到底需要什么样的隔离级别。
四个隔离级别:
Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
Read committed:可避免脏读情况发生(读已提交)
Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
安全性考虑:Serializable>Repeatable read>Read committed>Read uncommitted
数据库效率:Read uncommitted>Read committed>Repeatable read>Serializable
一般情况下,我们会使用Repeatable read、Read committed mysql数据库默认的数据库隔离级别Repeatable read
mysql中设置数据库的隔离级别语句:
set [global/session] transaction isolation level xxxx;-- 查看隔离级别
MariaDB [s1]> select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.00 sec)
16.4、实例
有N个设备议器插入模拟数据, 时间必须不一致,页面中查询时需要
import pymysqlconn = pymysql.connect(host="10.1.1.1",port=3306,user="test",passwd="test",db="test")
cursor = conn.cursor()import random,time
def system_time(start,end):# 获取时间time_range=random.randrange(start,end)times=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time_range))return timesa=["s0000000001111000000000000000001","s0000000001111000000000000000003","00000001111100ff0000000111110001"]# 循环每个议器,取出前12位,获取起始时间结束时间,然后插入到数据库中,最后一定要commit
alen = len(a)
for i in range(alen):para_id = a[i]rtu_cude = a[i][:12]for i in range(1,1000):COLLECT_TIME = system_time(1513000000, 1525000000)SYSTEM_TIME = system_time(1533000000, 1533193884)aaa = 'INSERT INTO `xx` (`top1`, `COLLECT_TIME`, `SYSTEM_TIME`, `cor_vlu`,`tco`) VALUES ("%s", "%s", "%s", "3175.46","%s")'%(para_id,COLLECT_TIME,SYSTEM_TIME,rtu_cude)cursor.execute(aaa)conn.commit()
转载于:https://blog.51cto.com/xiong51/2092563
相关文章:

linux打开 root .m2,小辣椒M2 (LA-M2)获取ROOT权限教程,新手root必看
小辣椒M2 (LA-M2)如何获取ROOT权限?用什么ROOT工具最简单?请跟着小编一起来看看如何用奇兔刷机对小辣椒M2 (LA-M2)进行一键ROOT,小编特别亲手制作了详细的小辣椒M2 (LA-M2) ROOT教程图解,非常适合初次接触ROOT的朋友,具体步骤如下ÿ…

C++中typedef和define的区别
typedef和#define的用法与区别 一、typedef的用法 在C/C语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT;typedef int …

SVN 钩子操作-同步更新web目录
一个简单的钩子演示:也可以网上搜索其他高级的 本次想要达到的功能是:每次用户commit 到仓库后,仓库的钩子会自动把程序又更新的www/的web发布目录 1.现在web目录下创建一个test.com网站目录 [rootwentao13 ~]# cd /var/www/html/ [rootwenta…

【组队学习】【32期】深入理解计算机系统
深入理解计算机系统 航路开辟者:李岳昆、易远哲领航员:初晓宇航海士:叶前坤、沈豪 基本信息 开源内容:https://github.com/datawhalechina/team-learning-program/tree/master/ComputerSystems内容属性:公测课程内容…

linux中怎么退出执行过程,(进程)处理过程中的Linux:从执行到退出
Linux是一个多任务操作系统,表面上看,同时运行许多任务——即进程。每一个进程都在系统中留下足迹。这里介绍一些检查这些足迹的工具,并且还要说明蔓延的/proc目录到底是什么。欢迎归来。上周我们考察Linux调度程序如何区分要运行的进程的优先…

git - 简易指南
http://www.bootcss.com/p/git-guide/转载于:https://www.cnblogs.com/passer1991/p/3279333.html

python爬虫 智联招聘 工作地点
需求:智联上找工作的时候,工作地点在搜索页面只能看到城市-区。看不到具体的地址。(离家近的工作肯定优先考虑)思路:爬取搜索页面(页面一)然后进去其中一个内页,再爬工作地点&#x…

2021-2022-1 线性代数知识点总结的视频
01 线性方程组02 矩阵及其运算03 向量空间(上)03 向量空间(下)04 特征值与特征向量05 实对称矩阵与二次型2021 线性代数 第三章 习题课2021 线性代数 第四章 习题课2021-2022-1 线性代数考试要点2021-2022-1 线性代数知识点总结 …

win使用linux共享打印机,Ubuntu 12.04以及 Window 下使用共享打印机
目前针对各个办公室里面都已经配置打印机了,为了节约资源,该打印机想必已经被网管设置成了共享,然而我们应该如何进行使用呢?笔者目前常用的系统是Ubuntu 12.04,偶尔想打印东西的不想切换到XP系统下,就此简单介绍下如何…

poj3280Cheapest Palindrome(记忆化)
链接 真的1A了。。 一开始想复杂了 想着补全再删 没想好 后来想到递归 大的回文串是由小的推过来的 一直递归下去 对于当前的i,j可以选择保留或者删除 选个最小的 1 #include <iostream>2 #include<cstring>3 #include<algorithm>4 #include<…

【组队学习】【32期】推荐系统-新闻推荐系统实践
推荐系统-新闻推荐系统实践 航路开辟者:罗如意领航员:肖桐航海士:汪志鸿、吴忠强、赖敏材、王辰玥、毛伟、宋禹成、陈雨龙、管柯琴 基本信息 开源内容:https://github.com/datawhalechina/fun-rec内容属性:公测课程…

Redis配置到本地以及可视化工具的安装运用
配置到本地出错: 解决方法: 1、先把原来的服务删除了 2、在重新配置服务。 真的,我就是这样的。。 转载于:https://www.cnblogs.com/stujike/p/8672165.html

linux消息通信无法接收,进程间通信:消息队列有关问题:进程1接收不到进程2的消息...
进程间通信:消息队列有关问题:进程1接收不到进程2的消息进程间通信:消息队列有关问题:进程1接收不到进程2的消息日期:2014-05-16 浏览次数:20365 次进程间通信:消息队列问题:进程1…

java听课笔记(四)
程序流程控制 分支 顺序 循环 if switch&case 1 2 3 调整 break 1.6 前 switch(byte、short、char、int) 1.7 可放String 循环 while(次数不确定) do while for(确定次数) break(跳出本层循环) continu…

【组队学习】【32期】scikit-learn教程
scikit-learn教程 航路开辟者:江季领航员:李牧轩航海士:武帅、陈宇 基本信息 开源内容::https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn内容属性:公测课程内容…

css一个很好用的hover显示
之前一直想在样式实现,hover时显示其他div,今天终于找到了,(*^▽^*).a悬停时显示.b.a:hover .b {display: block;}转载于:https://www.cnblogs.com/HCXiao/p/8677713.html

c语言输入函数有什么作用,c语言的输入函数有哪些
c语言的输入函数有:1、scanf()函数、从标准输入stdin读取格式化输入;2、getchar()函数,从标准输入stdin获取一个字符;3、gets()函数,从标准输入stdin读取一行;4、getch()函数。【相关学习推荐:C…

dubbo学习过程、使用经验分享及实现原理简单介绍
一、前言部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下。整理这篇文章差不多花了两天半时间…

AutoIt脚本在做自动化操作的时候,如何进行错误捕获?
我的自动化脚本在运行的时候,会生成一个界面,点击该页面上的按钮能够进行自动化操作。 经常遇到的一个问题是: 脚本运行一半,GUI程序出现了异常情况,这个时候,再次点击生成的界面上的按钮,不会有…

中国电子学会青少年编程能力等级测试图形化四级编程题:计算生肖
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…

用c语言写一个两线程程序,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统,C语言实现多线程:#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg );return …

中国电子学会青少年编程能力等级测试图形化四级编程题:抽奖
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…
github README.md教程
github README.md教程 总结 github中README.md通过特殊字符标记和缩进来达到格式控制,也可以用HTML标签来实现格式控制。 教程一: Markdown 的目标是实现「易读易写」,兼容HTML。 但是,在 HTML 区块标签间的 Markdown 格式语法将不…

this.options[selectedIndex]的使用
<select id"sel" οnchange"javascript:getSelect();"> <option value"a">选择</option> <option value"bdd">be</option> <option value"c">ce</option> <option value"…

c语言怎么创建一个h文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼简答题】实验任务:学生成绩统计从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:(1)统计不及格人数并打印不及格学…

Makefile所有内嵌函数
一、文本处理函数以下是GNU make内嵌的文本(字符串)处理函数。1 $(subst FROM,TO,TEXT)函数名称:字符串替换函数—subst。函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”。返回值:替换后的新字符串。示例…

青少年编程竞赛交流群周报(第041周)
2021年12月12日(周日)晚20:00我们在青少年编程竞赛交流群开展了第四十一期直播活动。 一、直播内容 我们直播活动的主要内容如下: 讲解了上次测试中小朋友们做错的题目 Scratch青少年编程能力等级测试模拟题(四级)。…

docker的用法
Docker是开发人员和系统管理员构建,发布和运行分布式应用程序的开放平台,可以在笔记本电脑、数据中心、虚拟机还有云服务器上运行。 使用Docker工具来提高生产率的方法:本地依赖:你需要在本地系统上快速试用 magento 吗࿱…

android 背景切换动画效果代码,关于Android shape gradient背景渐变
百度后,发现渐变色不仅可以根据xml来实现,也可以用java代码来实现,由于目前没有那么多时间,只记录xml实现的方法;以后在记录Java实现的代码。通过Shape gradient标签来实现首先来看gradient标签所有的渐变属性…

Linux Ubuntu 自动登录
我一直在用Ubuntu发型版本的Linux系统,很喜欢把它做得更加的方便易用,特别是Ubuntu的Server版本,因为没有Desktop的 GUI界面,也没有自动登录设置,无法通过简单的点击鼠标方式来设置自动登录,在查阅了一些资…