首先你得学会基本的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增删改查的更多相关文章

  1. python连接MySQL pymysql模块,游标,SQL注入问题,增删改查操作

    pymysql模块 pymysql是用python控制终端对MySQL数据库进行操作的第三方模块 import pymysql # 1.连接数据库 client = pymysql.connect( ...

  2. 使用python操作XML增删改查

    使用python操作XML增删改查 什么是XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输 ...

  3. 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查

    内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...

  4. python笔记33-python3连mysql增删改查

    前言 做自动化测试的时候,注册了一个新用户,产生了多余的数据,下次用同一账号就无法注册了,这种情况该怎么办呢? 自动化测试都有个数据准备和数据清理的操作,如果因为此用例产生了多余的数据,就需要数据清理 ...

  5. 文件操作之增删改查3---文件的修改,f.replace(),在linux里的一些应用sed,with语句方法来打开一个或多个文件避免忘记关闭,python一行写的太长,怎么编写多行的规范

    f.replace()with open("xxx","r",encoding="utf-8") as f: 想修改文件中间的数据,有两个办 ...

  6. Django【第6篇】:Django之ORM单表操作(增删改查)

    django之数据库表的单表查询 一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name =& ...

  7. 5.Python文件操作之增删改查

    需求一:取文件的前几行: f = open("yesterday","r",encoding="utf-8") for i in range ...

  8. Python 3 Mysql 增删改查

    import pymysql import datainfo import time #获取参数 host = datainfo.host username = datainfo.username p ...

  9. python函数模拟mysql增删改查功能

    import os list1 = ['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date'] def staff_info(): #获取员 ...

随机推荐

  1. Linux 权限位详解

    1. Linux 权限位 对于权限,有点绕,因为文件的权限和目录的权限是有一些区别的. 在Linux中,有5种权限,分别是,r.w.x.s.t. 可读权限:r 可写权限:w 可执行权限:x Setui ...

  2. mysql中主键和唯一键的区别

    区别项 primary key(主键) unique(唯一键约束) 唯一性 可以 可以 是否可以为空 不可以 可以 允许个数 只能有1个 允许多个 是否允许多列组合 允许 允许

  3. 【转载】wifi的两种工作模式

    AP:即无线接入点,是一个无线网络的中心节点.通常使用的无线路由器就是一个AP,其它无线终端 可以通过AP相互连接. STA:即无线站点,是一个无线网络的终端.如笔记本电脑.PDA等. 1>工作 ...

  4. 简单了解static

    初学java,面对着这个static修饰符,愣是琢磨了两天时间,还在今天琢磨透了,现在将悟到的东西记录下来: 1.static修饰符表示静态修饰符,其所修饰的内容(变量.方法.代码块暂时学到这三种)统 ...

  5. 容器概念与Linux Container原理

    一.容器与LxC 在像KVM等众多主机虚拟化解决方案中,对每一个虚拟机实例提供的是从底层硬件开始一直到上层的环境,在硬件级进行资源划分.虚拟机的内核是运行在硬件内核之上的.由于每个虚拟实例都有自己的运 ...

  6. 关于VUE首屏加载过长的优化,VUE项目开发优化

    1. 按需引入UI组件 当下市面上流行的UI组件基本都支持按需加载,本文以Element UI为例: (1)     新建一个elementUI.js文件 (2)     访问地址找到按需引入方式的说 ...

  7. 【golang-GUI开发】struct tags系统(二)qt的自定义组件和构造函数

    今天我们来讲讲自定义组件和它的构造函数. 在前面的文章里我们已经接触了好几个自定组件,这次的示例是一个自定义对话框,他有一个about按钮,点击按钮可以显示出Qt的信息或者用户输入的信息.这是效果图: ...

  8. Netty实战十三之使用UDP广播事件

    1.UDP的基础知识 我们将会把重点放在一个无连接协议即用户数据报协议(UDP)上,它通常用在性能至关重要并且能够容忍一定的数据报丢失的情况下. 面向连接的传输(如TCP)管理了两个网络端点之间的连接 ...

  9. Java学习笔记之——内部类

    内部类 形式:把一个类定义在一个类的内部. 分为:成员内部类和匿名内部类重点掌握 a) 成员内部类 b) 静态成员内部类 c) 匿名内部类 d) 局部内部类 (1)成员内部类: Java的语言是面向对 ...

  10. js高级:event,事件冒泡,事件捕获

    1.事件 浏览器客户端上客户触发的行为都称为事件 所有的事件都是天生自带的,不需要我们去绑定,只需要我们去触发. 通过 obj.事件名=function(){} 事件名:onmouseover 鼠标悬 ...