python3入门教程(二)操作数据库(一)
概述
最近在准备写一个爬虫的练手项目,基本想法是把某新闻网站的内容分类爬取下来,保存至数据库,再通过接口对外输出(提供后台查询接口)。那么问题就来了,python到底是怎么去操作数据库的呢?我们今天就来研究下。
准备
我这边数据库使用的是mysql5.7,python去操作mysql数据库需要使用到pymysql模块。
安装pymysql很简单,可以使用pip,
pip install pymysql
也可以通过pycharm直接添加安装。
使用操作
我们新建一个数据库,名字就叫做news,我们再创建一张news表(取名字这种事情真的非常纠结),语句如下:
CREATE TABLE `news` (
`id` bigint(100) NOT NULL AUTO_INCREMENT,
`title` varchar(1000) DEFAULT NULL,
`url` varchar(1000) DEFAULT NULL,
`hash` varchar(1000) DEFAULT NULL,
`publish_time` varchar(15) DEFAULT NULL,
`catagary` varchar(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
这张表设计的有些随意,不过这不是重点,重点是我们如何利用python去操作这张表,下面我们就进入主题。
首先,我们新建python file,然后导入我们要用到的模块
import pymysql
1.获取数据库连接及游标
之前有用过数据库的同学肯定知道,用代码去操作数据库之前,肯定先要获取连接,后续的增删改查都是基于这个连接,当然,相应的操作完成之后,一定要记得把连接关闭,不然会造成一些不好的后果。
python获取数据库连接代码如下:
import pymysql
# 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
运行之后输出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000001D359180B00> Process finished with exit code 0
显然,我们已经成功获取到了一个连接,当然要执行sql语句,我们好需要获取一个游标对象,
import pymysql
# 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象(这样写默认返回的数据类型是元组,我们下面会有介绍)
cursor = conn.cursor() print(cursor)
运行之后输出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x0000025F14470B70>
<pymysql.cursors.Cursor object at 0x0000025F14AC8E10> Process finished with exit code 0
游标对象已经成功拿到了
2.新增数据
import pymysql # 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象
cursor = conn.cursor()
print(cursor)
# 新增一条数据
insert_sql = 'insert into news(title, url, hash, publish_time, catagary) values(%s, %s, %s, %s, %s)'
row = cursor.execute(insert_sql, ('百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')) # 参数为元组类型
print(row)
print(cursor.lastrowid) # 获取最后一次自增的ID
执行上面的代码,输出结果如下:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x0000023455416358>
<pymysql.cursors.Cursor object at 0x00000234559F8E10>
1
2 Process finished with exit code 0
从输出结果可以看出,似乎已经插入成功了,我们取数据库看一下,结果是令人失望的,数据库没有,什么情况呢?
原因其实很简单,我们没有做commit操作,我们把commit加上,再试下
import pymysql # 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象
cursor = conn.cursor()
print(cursor) # 新增一条数据
insert_sql = 'insert into news(title, url, hash, publish_time, catagary) values(%s, %s, %s, %s, %s)' # 使用pymysql的参数化语句防止SQL注入
# 返回受影响的行数
row = cursor.execute(insert_sql, ('百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')) # 参数为元组类型
print(row)
print(cursor.lastrowid) # 获取最后一次自增的ID conn.commit() # 提交数据
cursor.close() # 关闭游标
conn.close() # 关闭连接
下面我们再运行下,输出如下:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000001D60F605630>
<pymysql.cursors.Cursor object at 0x000001D60FD88E80>
1
3 Process finished with exit code 0
我们查一下数据库,这下就有了,插入成功了。

当然也可以批量插入,使用executemany
import pymysql # 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象
cursor = conn.cursor()
print(cursor) # 新增一条数据
insert_sql = 'insert into news(title, url, hash, publish_time, catagary) values(%s, %s, %s, %s, %s)' # 使用pymysql的参数化语句防止SQL注入
# 返回受影响的行数
#row = cursor.execute(insert_sql, ('百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')) # 参数为元组类型
#print(row)
#print(cursor.lastrowid) # 获取最后一次自增的ID # 新增多条数据
row = cursor.executemany(insert_sql, [('百度1', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0'),
('百度2', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0'),
('百度3', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')]) print(row) conn.commit() # 提交数据
cursor.close() # 关闭游标
conn.close() # 关闭连接
执行上面的脚本,输出结果如下:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000001A454EF5630>
<pymysql.cursors.Cursor object at 0x000001A455678E48>
3
Process finished with exit code 0
查询数据库,如下:

批量插入成功。
3.查询数据
前面插入数据成功了,我们研究下怎么查询
import pymysql # 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象
cursor = conn.cursor()
print(cursor) query_sql = 'select * from news where id = %s'
row = cursor.execute(query_sql, (3,))
print(row) # 查询到的行数
print(cursor.fetchall()) # fetchall:获取所有行的信息 fetchone:获取结果集中第一行的数据 fetchmany:获取结果集中的多行 conn.commit() # 提交数据
cursor.close() # 关闭游标
conn.close() # 关闭连接
执行上面的查询,输出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000001C5D9107320>
<pymysql.cursors.Cursor object at 0x000001C5D9748EF0>
1
((3, '百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0'),) Process finished with exit code 0
从输出结果我们可以看到,最后拿到的结果集是一个元组类型,那假如我们想要的是字典类型呢?
我们只需要在初始化游标的时候,稍微设置一下
cursor = conn.cursor(pymysql.cursors.DictCursor)
我们加上再试下,
import pymysql # 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)
print(cursor) query_sql = 'select * from news where id = %s'
row = cursor.execute(query_sql, (3,))
print(row) # 查询到的行数
print(cursor.fetchall()) # fetchall:获取所有行的信息 fetchone:获取结果集中第一行的数据 fetchmany:获取结果集中的多行 conn.commit() # 提交数据
cursor.close() # 关闭游标
conn.close() # 关闭连接
运行之后输出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000002A433136358>
<pymysql.cursors.DictCursor object at 0x000002A433778E48>
1
[{'id': 3, 'title': '百度', 'url': 'http://www.baidu.com', 'hash': '1qaz2wsx', 'publish_time': '2018-11-02', 'catagary': '0'}] Process finished with exit code 0
可以看到,结果集的数据类型变了,这样比较方面去处理具体的数据内容。
4.更新数据
import pymysql # 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)
print(cursor) update_sql = 'update news set title = %s where id = %s'
row_upd = cursor.execute(update_sql, ('百度Updata', 3)) # 也可使用executemany实现批量更新
print(row_upd) query_sql = 'select * from news where id = %s'
row = cursor.execute(query_sql, (3,))
print(row) # 查询到的行数
print(cursor.fetchall()) # fetchall:获取所有行的信息 fetchone:获取结果集中第一行的数据 fetchmany:获取结果集中的多行 conn.commit() # 提交数据
cursor.close() # 关闭游标
conn.close() # 关闭连接
我们更新id=3的那条数据的标题,运行上面的代码,输出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000001FCDBB36390>
<pymysql.cursors.DictCursor object at 0x000001FCDC158EB8>
1
1
[{'id': 3, 'title': '百度Updata', 'url': 'http://www.baidu.com', 'hash': '1qaz2wsx', 'publish_time': '2018-11-02', 'catagary': '0'}] Process finished with exit code 0
更新成功。
5.删除数据
删除数据其实更上面的更新差不多,只是sql不一样。
import pymysql # 获取连接 参数(数据库IP,端口,用户名,密码,数据库名称,编码格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 获取操作sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)
print(cursor) delete_sql = 'delete from news where id=%s'
row_delete = cursor.execute(delete_sql, (3,)) # 也可以使用executemany实现批量删除 query_sql = 'select * from news where id = %s'
row = cursor.execute(query_sql, (3,))
print(row) # 查询到的行数
print(cursor.fetchall()) # fetchall:获取所有行的信息 fetchone:获取结果集中第一行的数据 fetchmany:获取结果集中的多行 conn.commit() # 提交数据
cursor.close() # 关闭游标
conn.close() # 关闭连接
python3入门教程(二)操作数据库(一)的更多相关文章
- mongodb入门教程二
title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...
- Elasticsearch入门教程(二):Elasticsearch核心概念
原文:Elasticsearch入门教程(二):Elasticsearch核心概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:ht ...
- RabbitMQ入门教程(二):简介和基本概念
原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- 无废话ExtJs 入门教程二[Hello World]
无废话ExtJs 入门教程二[Hello World] extjs技术交流,欢迎加群(201926085) 我们在学校里学习任何一门语言都是从"Hello World"开始,这里我 ...
- SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1
在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...
- Python3.x:SQLAlchemy操作数据库
Python3.x:SQLAlchemy操作数据库 前言 SQLAlchemy是一个ORM框架(Object Rational Mapping,对象关系映射),它可以帮助我们更加优雅.更加高效的实现数 ...
- PySide——Python图形化界面入门教程(二)
PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...
- JasperReports入门教程(二):中文打印
JasperReports入门教程(二):中文打印 背景 在上一篇中我们介绍了JasperReport的基本入门,也展示了一个报表.但是我们的示例都是使用的英文,如果我们把需要打印的数据改为中文会怎么 ...
随机推荐
- ServletContext详解(转)
ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext,所 ...
- ArchLinux安装Sublime Text 3
安装方法: 在 /etc/pacman.conf中添加 [archlinuxcn] SigLevel = Optional TrustAll Server = http://repo.archlinu ...
- VCS
timing check相关的, +notimingcheck命令,可以用在compile时,也可以用在run time的时候, 都是将检查timing的系统函数,都disable掉了, 加在comp ...
- List 循环删除 指定元素的 方法
使用Iterator进行循环,在删除指定元素.如果使用for 或 foreach 在删除指定下标是,list.size 会相应的缩短且下标前移,导致相邻满足条件的元素未删除 Iterator<S ...
- SolrJ的入门
什么是SolrJ? solrj是访问solr服务的java客户端,提供索引和搜索的请求方法, SolrJ和图形界面操作的区别就类似于数据库中使用jdbc和mysql客户端的区别一样. 我在测试Solr ...
- Docker Kubernetes 容器重启策略
Docker Kubernetes 容器重启策略 当容器被创建时,容器会根据重启策略来进行容器重启. 支持三种策略: Always:当容器终止退出后,总是重启容器,默认策略. OnFailure:当容 ...
- Python RabbitMQ消息持久化
RabbitMQ消息持久化:就是将队列中的消息永久的存放在队列中. 处理方案: # 在实例化时加入durable=True来确认消息的实例化,客户端服务端都要写 channel.queue_dec ...
- Python 缓存服务
缓存服务:mongodb.redis.memcache mongodb:早期的缓存系统,直接持久话,数据即存内存也同步到硬盘. redis:主流缓存系统,半持久化,默认存在内存,需要手动调用存在硬盘, ...
- Quick Union
Quick Union quick union就是快速连接 和quick find相同,也是构建一个数组id[],不过存的值换一种理解: 每个数组内的元素看做一个结点,结点内的值即id[i]看做i的前 ...
- 【题解】JSOIWC2019 Round2
题面: 题解: T1: 毕竟是tg膜你,不会太难 就是一道简单贪心 首先,对于a<=b的所有物品,一定是贪心的按照a从小到大放入. 先假设剩下的物品可以按照某种顺序放进去,那么可以得到一个最终空 ...