python数据库操作教程_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获取数据库连接代码如下:

importpymysql

# 获取连接 参数(数据库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

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

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

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

1

3

Process finished with exit code 0

我们查一下数据库,这下就有了,插入成功了。

32265b2aac3310ae81461406f27b42da.png

当然也可以批量插入,使用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

3

Process finished with exit code 0

查询数据库,如下:

a8fbf5038ace26845ce0852b9ddf068e.png

批量插入成功。

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

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

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

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() # 关闭连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值