洗礼灵魂,修炼python(91)-- 知识拾遗篇 —— pymysql模块之python操作mysql增删改查
首先你得学会基本的mysql操作语句:mysql学习
其次,python要想操作mysql,靠python的内置模块是不行的,而如果通过os模块调用cmd命令虽然原理上是可以的,但是还是不太方便,那么这个问题,很早就有人想过了,而且还做出来了,不废话,就是第三方模块pymysql和mysqldb了。
但是,python3暂不支持mysqldb,pymysql却是python2和3都支持的
所以,本篇博文说说pymysql,学了pymysql,mysqldb其实你也会了
pymysql
1.安装
使用pip安装:
2.使用
增:
1)固定数据插入:
#!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import pymysql # 创建数据库连接 conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='',db='test') # 创建游标,这里的游标你可以理解为文本操作里的walk指针 cursor = conn.cursor() # sql语句 cursor.execute('insert into user(name,age,part_id) VALUES("ling",32,2)') # 提交数据,你可以理解为文本操作里的flush()刷新缓存存储为数据 conn.commit() # 关闭连接 cursor.close() conn.close()
在运行之前,先看下数据库里的数据:
好的,开始运行:
运行结果:
没有报错就是好消息,再看下数据有变化没有:
好的,插入进去了
先看图:
其实你有没有发现,这些都是固定的格式,就和socket差不多,就标注的那两句是有变化的,第一句是连接数据库等设置,第二据就是我们的sql语句,那么问题就简单了对吧?
然后,如果你插入的数据希望是中文的,还可以在第一句创建数据库连接时时加一个参数charset:
# 创建数据库连接 conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='',db='test',charset='utf8')
2)字符串拼接活动插入:
那么再看,如果我们让用户自己输入待插入的数据呢:
其他不变,只修改这一部分
A:多个列数据插入
注意上面的VALUES()里不用再加引号,因为input里已经有引号了
运行结果:
B:如果你只是插入一单个数据,可以这样:
C:那么有朋友要问了,为什么不这样作字符串拼接呢:
这个方法虽然也可行,但是是明令禁止的,因为可能会出现sql注入漏洞,而用上面的方法的话,execute()方法可以传入两个参数,自动帮我们字符串拼接好了
D:sql注入漏洞范例:
看到了吧,其实我的表里并没有23的部门id对吧,但是还是查询出来了,那么如果查询的表是保存的所有用户名和密码呢?这个注入是不是很可怕了对吧?
还有更多的注入语句:
万能密码:'or'='or' select * from table where username='' or '=' or '' and password=''; "or"a"="a ')or('a'='a ")or("a"="a 'or 1=1-- "or 1=1-- 'or"=' 'or 1=1%00 'or 1=1/* admin' or 1=1/*
所以一般不用这种字符串拼接的方法,还是使用pymysql给我们封装好的方法execute和executemany
E:插入一个可迭代对象:
#!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import pymysql # 创建数据库连接 conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='',db='test',charset='utf8') # 创建游标 cursor = conn.cursor() user1 = input('请输入待插入的姓名:') age1 = input('请输入待插入的年龄:') id1 = input('请输入待插入的部门id:') print('已记录') user2 = input('请输入待插入的姓名:') age2 = input('请输入待插入的年龄:') id2 = input('请输入待插入的部门id:') print('已记录') li = [(user1,age1,id1), (user2,age2,id2) ] # sql语句 cursor.executemany('insert into user(name,age,part_id) VALUES(%s,%s,%s)',li) # 提交数据 conn.commit() # 关闭连接 cursor.close() conn.close()
注意上面我插入sql语句的方法已经改成executemany,不然使用execute方法会报错
运行结果:
改:
目前表里的数据是这些:
还是上面那语句,只改了这一块,其他不变
运行结果:
完全OjbK
删:
先看下目前的数据:
同样的,其他不变,就下面这一段有变化
运行结果:
一样的OjbK
查:
#!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import pymysql # 创建数据库连接 conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='',db='test',charset='utf8') # 创建游标 cursor = conn.cursor() # sql语句 cursor.execute('select * from user') print(cursor.fetchone()) # 关闭连接 cursor.close() conn.close()
注意:使用查询语句时不用给commit()方法,因为没有修改数据,只是把数据拿出来而已,增删改都有对数据进行修改的操作,所以需要使用commit
能理解吧?
查询时,需要使用fetchone(),fetchmany([int]),fetchall()来得到查询的结果
fetchone运行结果:
fetchmany运行结果:
fetchall()运行结果:
如果你想同时使用fetchone,fetchmany,fetchall的话,会成这样:
我想,你应该能看懂,不用我多说,反正你知道它就和文本读取操作是一样的,都有指针
那么你说,我就是想同时使用上面的三个fetch方法,并且我想让它都能正确的取到希望的数据,这个怎么办呢?在文本操作里我们可以使用seek()来设定指针位置,那么这里使用什么方法呢?
cursor.scroll(0,mode='absolute') #相对当前位置移动 cursor.scroll(0,mode='relative') #相对绝对位置移动
没错了,使用这个scroll方法就可以修改指针位置了
好的,现在再看看:
补充:如果你插入数据后,希望知道自增列有多少数据了,可以使用代码查看:
row = cursor.lastrowid
完美!O了,本篇博文结束
洗礼灵魂,修炼python(91)-- 知识拾遗篇 —— pymysql模块之python操作mysql增删改查的更多相关文章
- python连接MySQL pymysql模块,游标,SQL注入问题,增删改查操作
pymysql模块 pymysql是用python控制终端对MySQL数据库进行操作的第三方模块 import pymysql # 1.连接数据库 client = pymysql.connect( ...
- 使用python操作XML增删改查
使用python操作XML增删改查 什么是XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输 ...
- 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查
内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...
- python笔记33-python3连mysql增删改查
前言 做自动化测试的时候,注册了一个新用户,产生了多余的数据,下次用同一账号就无法注册了,这种情况该怎么办呢? 自动化测试都有个数据准备和数据清理的操作,如果因为此用例产生了多余的数据,就需要数据清理 ...
- 文件操作之增删改查3---文件的修改,f.replace(),在linux里的一些应用sed,with语句方法来打开一个或多个文件避免忘记关闭,python一行写的太长,怎么编写多行的规范
f.replace()with open("xxx","r",encoding="utf-8") as f: 想修改文件中间的数据,有两个办 ...
- Django【第6篇】:Django之ORM单表操作(增删改查)
django之数据库表的单表查询 一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name =& ...
- 5.Python文件操作之增删改查
需求一:取文件的前几行: f = open("yesterday","r",encoding="utf-8") for i in range ...
- Python 3 Mysql 增删改查
import pymysql import datainfo import time #获取参数 host = datainfo.host username = datainfo.username p ...
- python函数模拟mysql增删改查功能
import os list1 = ['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date'] def staff_info(): #获取员 ...
随机推荐
- linux 命令 — sed
sed stream editor,流编辑器 查找替换 sed 's/pattern/replace_string/' file 替换每一行第一次出现的pattern,将替换后的文本输出到stdout ...
- Zookeeper Client简介
直接使用zk的api实现业务功能比较繁琐.因为要处理session loss,session expire等异常,在发生这些异常后进行重连.又因为ZK的watcher是一次性的,如果要基于wather ...
- React hooks实践
前言 最近要对旧的项目进行重构,统一使用全新的react技术栈.同时,我们也决定尝试使用React hooks来进行开发,但是,由于React hooks崇尚的是使用(也只能使用)function c ...
- 使用3D Slicer进行颅骨去除
关于3D Slicer的下载.安装及模块安装在上一篇博客中以及介绍过,以下将专注于使用3D Slicer进行颅骨去除 准备 此次,我们需要安装SwissSkullStripper模块,安装后需要重启软 ...
- [转]Javascript中几种较为流行的继承方式
出处:http://www.jianshu.com/p/a6c005228a75 开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascrip ...
- 创业公司都在使用的3款Python库
Instavest上发表了一篇博文,文章分享了深受创业公司喜爱的3款Python库,该文章在Hacker News上引发了开发者的激烈探讨,如果你也对此感兴趣,不妨移步去看下.笔者将该文简译过来以分享 ...
- 爬虫之抓取js生成的数据
有很多页面,当我们用request发送请求,返回的内容里面并没有页面上显示的数据,主要有两种情况,一是通过ajax异步发送请求,得到响应把数据放入页面中,对于这种情况,我们可以查看关于ajax的请求, ...
- sublime text 安装nodejs开发插件
系统:windows10nodejs版本:v6.1.14 请先配置好环境变量,这里就不说啦. 下载并设置nodejs插件 下载地址为https://github.com/tanepiper/Subli ...
- 深入理解JAVA中的NIO
前言: 传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 CPU 使用效率大大降低. 所以,jdk 1.4 发布了 NIO 包,NIO 的文件读写设计颠覆了传统 IO 的设 ...
- Java学习笔记之——枚举类
枚举可以限定类的值只是有限个,例如:星期,只有星期一到星期天 语法案例: