Python与MySQL数据库的交互实战
作者 | Huang supreme
编辑 | 郭芮
图源 | 视觉中国
安装PyMySQL库
如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上,就用如下链接找一个合适的安装包,进行安装,这个就不细说了。
https://www.lfd.uci.edu/~gohlke/pythonlibs/
使用Python连接MySQL数据库
1)六个常用的连接参数
参数host:mysql服务器所在的主机的ip;
参数user:用户名
参数password:密码
参数port:连接的mysql主机的端口,默认是3306
参数db:连接的数据库名
参数charset:当读取数据出现中文会乱码的时候,需要我们设置一下编码;我们使用python操作数据库的时候,那么python就相当于是client,我们是用这个client来操作mysql的server服务器,python3默认采用的utf8字符集,我的mysql服务器默认采用latin1字符集,因此mysql中创建的每张表,都是建表的时候加了utf8编码的,因此这里设置的应该就是connection连接器的编码。
2)python连接mysql的语法
import pymysql db=pymysql.connect(host='localhost',user='root',password='123456', port=3306,db='spiders',charset=' utf8')
最基本的参数是host,user,password和port,必须要有。剩下两个参数根据你自己的情况决定是否使用。
host指的是mysql服务器安装在哪里,由于我的mysql就是安装在本机上,因此这里可以写localhost,我也可以写成主机名或者主机ip。
db指的是你要操作的是哪一个数据库,在进行数据库连接的时候,最好加上这个参数。
3)一个简单的热身案例
# 导包import pymysql # 使用pymysql连接上mysql数据库服务器,创建了一个数据库对象;db=pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='huangwei', charset='utf8')# 开启mysql的游标功能,创建一个游标对象;cursor = db.cursor()# 要执行的SQL语句;sql = "select * from student"# 使用游标对象执行SQL语句;cursor.execute(sql)# 使用fetchone()方法,获取返回的结果,但是需要用变量保存返回结果;data = cursor.fetchone()print(data)# 断开数据库的连接,释放资源;db.close()
结果如下:
Cursor游标对象的一些常用方法
1)cursor用来执行命令的方法
execute(query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数;
executemany(query, args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数;
2)cursor用来接收返回值的方法
fetchone():返回一条结果行;
fetchmany(size):接收size条返回结果行。如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据;
fetchall():接收全部的返回结果行;
创建表(建)
import pymysql db=pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='huangwei', charset='utf8')
# 创建一个游标对象;cursor = db.cursor()
# 建表语句;sql = """create table person( id int auto_increment primary key not null, name varchar(10) not null, age int not null) charset=utf8"""
# 执行sql语句;cursor.execute(sql)
# 断开数据库的连接;db.close()
注意:你在mysql中sql语句怎么写,在这里就怎么写。还有一个细节需要注意的是,在python中,将代码进行多次换行的时候,最好使用“三引号”。
查询数据(查)
1)fetchone():一次获取一条记录
import pymysql
db = pymysql.connect(host='localhost',user='root',db='huangwei', password='123456',port=3306,charset='utf8')
cursor = db.cursor()
cursor.execute('select count(*) from person')aa = cursor.fetchone()print(aa)# 注意这一句一定是在循环之外,不能放到循环里面。# 想想这是为什么?cursor.execute('select name,age from person') for i in range(aa[0]): a,b = cursor.fetchone() c = "我的名字叫{},今年{}岁".format(a,b) display(c)db.close()
结果如下:
2)fetchall():一次获取所有记录
import pymysql
db = pymysql.connect(host='localhost',user='root',db='huangwei', password='123456',port=3306,charset='utf8')
cursor = db.cursor()
cursor.execute('select name,age from person')aa = cursor.fetchall()# print(aa)for a,b in aa: c = "我的名字叫{},今年{}岁".format(a,b) display(c)db.close()
结果如下:
注:还有一个fetchmany()方法,用于一次性获取指定条数的记录,请自行下去研究。
3)使用pandas中的read_sql()方法,将提取到的数据直接转化为DataFrame,进行操作
import pymysql import pandas as pd
db = pymysql.connect(host='localhost',user='root',db='huangwei', password='123456',port=3306,charset='utf8')cursor = db.cursor()
df1 = pd.read_sql("select * from student where ssex='男'",db)display(df1)df2 = pd.read_sql("select * from student where ssex='女'",db)display(df2)
结果如下:
插入数据(增)
1)一次性插入一条数据
import pymysql
db=pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='huangwei', charset='utf8')
cursor = db.cursor()
# mysql中SQL语句怎么写,这里就怎么写;name = "猪八戒"age = 8000sql = 'insert into person(name,age) values ("猪八戒",8000)'
try: cursor.execute(sql) db.commit() print("插入成功")except: print("插入失败") db.rollback()db.close()
1.1)一次性插入一条数据
import pymysql
db=pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='huangwei', charset='utf8')
cursor = db.cursor()
# 插入数据sql = 'insert into person(name,age) values(%s,%s)'try: cursor.execute(sql,('孙悟空',100000)) db.commit() print("插入成功")except: print("插入失败") db.rollback()db.close()
2)一次性插入多条数据
import pymysqldb=pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='huangwei', charset='utf8')cursor = db.cursor()# 插入数据sql = 'insert into person(name,age) values(%s,%s)'# 注意:(('牛魔王',9000),('铁扇公主',8000),('玉皇大帝',6000))也可以# 小括号都可以换为中括号datas = [('牛魔王',9000),('铁扇公主',8000),('玉皇大帝',6000)]try: cursor.executemany(sql,datas) db.commit() print("插入成功")except: print("插入失败") db.rollback()db.close()
更新数据(改)
import pymysql
db=pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='huangwei', charset='utf8')
cursor = db.cursor()
# 更新数据sql = 'update person set age=%s where name=%s'try: cursor.execute(sql,[90000,"玉皇大帝"]) db.commit() print("更新成功")except: print("更新失败") db.rollback()db.close()
删除数据(删)
import pymysql
db=pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='huangwei', charset='utf8')
cursor = db.cursor()
# 删除数据sql = 'delete from person where age=8000'try: cursor.execute(sql) db.commit() print("删除成功")except: print("删除失败") db.rollback()db.close()
总结如下:
PyMySQL模块是默认开启MySQL的事务功能的,因此,进行 "增"、 "删"、"改"的时候,一定要使用db.commit()提交事务,否则就看不见所插入的数据。
进行 "增"、"删"、"改"的时候,一定要使用try…except…语句,因为万一没插入成功,其余代码都无法执行。当语句执行不成功,我们就db.rollback()回滚到操作之前的状态;当语句执行成功,我们就db.commit()提交事务。
作者:Huang supreme,个人博客地址:https://blog.csdn.net/weixin_41261833
【end】◆有奖征文◆推荐阅读超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M网红直播时的瘦脸、磨皮等美颜功能是如何实现的?比特币最主流,以太坊大跌,区块链技术“万金油”红利已结束 | 区块链开发者年度报告一文了解 Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控!用 3 个“鸽子”,告诉你闪电网络是怎样改变加密消息传递方式的!出生小镇、高考不顺、复旦执教、闯荡硅谷,59 岁陆奇为何如此“幸运”?你点的每个“在看”,我都认真当成了AI
相关文章:

Hyper-V的三种网卡
External 虚拟机和物理网络、本地主机都能通信 Internal 虚拟机之间互相通信,并且虚拟机能和本机通信 Private 仅允许运行在这台物理机上的虚拟机之间互相通信

filter-mapping中的dispatcher使用
web.xml里<filter-mapping>中的<dispatcher>作用 2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素,这个元素有四个可能的值:即 REQUEST,FORWARD,INCLUDE和ERROR 可以在一个<filter-mapping>元素中加入任意数目…
脉冲神经网络在目标检测的首次尝试,性能堪比CNN | AAAI 2020
译者 | VincentLee来源 | 晓飞的算法工程笔记脉冲神经网络(Spiking neural network, SNN)将脉冲神经元作为计算单元,能够模仿人类大脑的信息编码和处理过程。不同于CNN使用具体的值(continuous)进行信息传递,SNN通过脉冲序列(discrete)中每个脉冲发射时…

TCMalloc:线程缓存的Malloc
转载自: http://shiningray.cn/tcmalloc-thread-caching-malloc.html作者:Sanjay Ghemawat, Paul Menage 原文 翻译:ShiningRay 动机 TCMalloc要比glibc 2.3的malloc(可以从一个叫作ptmalloc2的独立库获得)和其他我测试…

今年央视的春晚能给人带来惊喜吗?
已经好多年还没看完中央电视台的春节联欢晚会自己就睡着了,说实在的,现在央视春节联欢晚会的节目总是让人期待后感到相当的平淡乏味,有些搞笑节目庸俗的让人笑不出来,绝大多数的节目都显得非常的人工,全然不能激发出观…

将baidu地图中的baidu logo去掉
Web 最简单方法,将logo的css样式改为display:none即可 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>移除百度地图LOGO和版权信息</title><script type"text/javascript" src"htt…

Linux环境网络库
安装libevent 官网:http://libevent.org/ 书籍:http://www.wangafu.net/~nickm/libevent-book/ Libevent参考手册翻译:http://blog.csdn.net/laoyi19861011/article/category/831215 Libevent参考手册翻译增加:http://blog.sina.co…
万人马拉松赛事,人脸识别系统如何快速、准确完成校验?
作者 | 阿里文娱技术专家墨贤出品 | AI科技大本营(ID:rgznai100)大麦的人脸闸机在2019年杭州马拉松上成功的完成了刷脸入场功能的首秀,相比传统的马拉松入场核验方案在入场体验和入场效率上都有了很大的提升,下面介绍一下大麦的人…

Collection集合List、Set
Collection集合,用来保存一组数据的数据结构。 Collection是一个接口,定义了所有集合都应该包含的特征和行为 Collection派生出了两类集合 List和Set List接口:List集合的特征是元素是可重复且有序 Set接口:Set集合的特征是元素是…
如何用Jupyter Notebook制作新冠病毒疫情追踪器?
出品 | AI科技大本营(ID:rgznai100)新冠肺炎已在全球范围内爆发。为了解全球疫情分布情况,有技术人员使用Jupyter Notebook绘制了两种疫情的等值线地图(choropleth chart)和散点图。前者显示了一个国家/地区的疫情扩散…

关于Aptana studio工具
今天,使用了Aptana studio这个工具,界面类似于Myeclipse因使用MyEclipse比较顺手,这个工具上手还挺容易的。而且比Dreamweaver好用多了,有代码提示的工具,再加上工具不大,耗内存较小。挺喜欢这个工具的。写…

再谈JSON -json定义及数据类型
再谈json 近期在项目中使用到了highcharts ,highstock做了一些统计分析。使用jQuery ajax那就不得不使用json, 可是在使用过程中也出现了非常多的疑惑,比方说,什么情况下我们须要去将字符串转换为json对象。什么情况下就不须要转换。通过hql和sql查询返回…

Linux软连接和硬链接
1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 【硬连接】 硬连接指通过索引节点来进行连接。在Linux的…

学语言不是写程序!
这是发到我邮箱里面的一封信,嗯,类似的信有好几封,春节期间呢,我主要陪笑笑,呵呵,不办公,就一直压着没有回答,有点delay了,现在给这几位同学抱个歉哈,对不住了…
“AI”战疫在行动,一文盘点百度大脑增援疫情防控的AI操作
2020年春节,注定将刻进每个人的记忆。面对突如其来的新型冠状病毒感染的肺炎疫情,除了一线医护人员的日夜奋战,“人工智能”也在特殊时期走向前沿,接受了抗疫洗礼。 3月13日,今年第一期百度大脑开放日首次通过直播的形…

POJ 2778 AC自己主动机+矩阵幂 不错的题
http://poj.org/problem?id2778 有空再又一次做下,对状态图的理解非常重要 题解: http://blog.csdn.net/morgan_xww/article/details/7834801 另外做了矩阵幂的模板: //ac.sz是矩阵的大小 void mulmtr(long long x[MAXNODE][MAXNODE],long l…

Libevent调用
1.最基本的打印libevent版本 #include <event.h> #include <stdio.h>int main() {const char *version event_get_version();printf("%s\n",version);return 0; }# gcc getVersion.c -o getVersion -levent 参考:https://github.com/mike-zh…
如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!
作者 | CloudFactory译者 | 天道酬勤 责编 | 徐威龙出品 | AI科技大本营(ID:rgznai100)高效的机器学习模型需要高质量的数据。训练你的机器学习模型并不是过程中的单个有限阶段。即使将其部署到生产环境中,也可能需要稳定的新训练数据流来确保…

占失物,笔记本电脑电池
公历:2009年3月18日18时11分 农历: 农历己丑年(牛)二月廿二 节气: 2009年3月5日19时2分惊蛰年建:己丑 月建:丁卯 日建:壬戌 时建:己酉 断:玄武中值天地合,故能寻到,在西方,又为长生之地,故为住…

Scala Learn 1 Basic
Chap 0 前言 focus on: Scala 的语法十分简洁Scala 运行在虚拟机之上, 可以使用 java 的海量类库和工具Scala 拥抱函数式编程的同时,并没有废弃面向对象Scala 既有动态语言那样的灵活简洁,同时有保留了静态类型检查的安全与执行效率Scala 既能处理脚本化…

linux下使用NetBeans调试libevent库
1.安装libevent 参考:http://blog.csdn.net/unix21/article/details/8679269 libevent安装在usr/local/libevent下 2.安装netBeans http://www.netbeans.org 3.配置netBeans 1)打开项目的属性选项,选择包含目录,把/usr//local/libevent/…

批量删除指定文件
Linux下的解决方法: # Linux Batch Delete find /home/data/-name ab.doc-exec rm -f {} \;注:最后反斜杠前有一空格,最后一个是分号。Windows下的解决方法:rem Windows Batch Delete 1: DEL /Q /S D:\home\data\*.class 2: FOR /R D…
百万人学AI:CSDN重磅共建人工智能技术新生态
站在AI发展的新十年起点上,CSDN将发挥开发者优势,与中国AI各行业和企业共建“百万人学AI”新技术生态。 作者 | CSDN新媒体事业部 8年前,现图灵奖得主Hinton团队在ImageNet竞赛中首次使用深度学习完胜Google等其它团队,顿时让工…

Android Property Animation属性动画:scale缩放动画(4)
Android Property Animation属性动画:scale缩放动画(4) 和之前我写的附录文章1,2,3相似,本文将接着使用Android Property Animation属性动画实现一个缩放的动画。代码部分和文章1,2,3中的代码大同小异&am…

结构体的两种声明方式:堆上和栈上以及在双链表的应用
在看《算法精解:C语言描述》的双链表chtbl和redis的双链表adlist.c发现代码思路基本是一致的。 但是,对于链表的初始化却不一样 1.《算法精解:C语言描述》风格 /************************************************************************…

COM 组件设计与应用(六)——用 ATL 写第一个组件(vc.net)
一、前言 1、与 《COM 组件设计与应用(五)》的内容基本一致。但本回讲解的是在 vc.net 2003 下的使用方法,即使你不再使用vc6.0,也请和上一回的内容,参照比对。2、这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外ÿ…

《评人工智能如何走向新阶段》后记(再续19)
由AI科技大本营下载自视觉中国304. 也来讨论构建模拟人类思维过程的认知计算机制,好像这个问题迄今尚未获得解决。 我们先从输入的信息类型说起:一类是语言输入(包括词、句、文本),第二类是图像输入(包括图…

PHP下载/采集远程图片到本地
2019独角兽企业重金招聘Python工程师标准>>> PHP下载/采集远程图片到本地01 /** 02* 下载远程图片到本地 03* 04* param string $url 远程文件地址 05* param string $filename 保存后的文件名(为空时则为随机生成的文件名,否则为原文件名&am…

Linux守护进程实现
Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() ! 0) exit(0); /* parent exits */setsid(); /* create a new session *//* Every output goes to /dev/null. If Redis is daemonized but* the logfile is set to stdout in the configuration …