文章目录:
- 一.MySQL数据库 1.MySQL的安装与配置 2.SQL语句详解
- 二.Python操作MySQL数据库 1.安装MySQL扩展包 2.程序接口DB-API 3.Python调用MySQLdb扩展包
- 三.Python操作Sqlite3数据库
- 四.总结
一.MySQL数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,在数据库管理系统中,用户可以对数据进行新增、删除、更新、查询等操作,从而转变为用户所需要的各种数据,并进行灵魂的管理。
前面介绍的Python网络数据爬取,得到的语料通常采用TXT文本、Excel或CSV格式进行存储的,而本文讲述了如何将爬取的数据存储至数据库中,从而更方便数据分析和数据统计。本文将重点介绍MySQL数据库相关知识及Python操作MySQL的方法。
数据库技术是信息管理系统、自动化办公系统、销售统计系统等各种信息系统的核心部分,是进行科学研究和决策管理的重要技术手段,常用的数据库包括:
- Oracle
- DB2
- MySQL
- SQL Server
- Sybase
- VF
- mongodb
由于MySQL数据库具有性能优良、稳定性好、配置简单、支持各种操作系统等优势,本文主要讲述Windows系统下Python操作MySQL数据库的内容。
1.MySQL的安装与配置
首先,打开浏览器输入MySQL官方网址“https://www.mysql.com/” ,点击“DOWNLOADS”菜单,显示如图1所示的下载页面。
接着找到MySQL软件的下载页面,网址如下,点击“Download”按钮下载相关软件,如下图所示的 mysql-installer-community-5.7.21.0.msi。同时,读者也可以直接在百度搜索“MySQL”软件下载安装。
- https://dev.mysql.com/downloads/installer/
最新已更新至MySQL 8.0版本。
图形化安装过程如下,作者结合数据库开发及实际安装经验进行叙述,读者如果想系统地学习MySQL数据库,推荐《深入浅出MySQL》这本书给大家。
(1) 双击MySQL安装文件setup.exe,进入MySQL安装欢迎界面,如图3所示,点击“Next”进行安装。
(2) 紧接着进入“Setup Type”界面,选择MySQL安装类型,这里选择“Typical”类型,如图4所示。
其中Typical表示安装常用的组件,默认安装到C盘“Program FilesMySQL”文件夹下,推荐读者选择此安装套件;Complete表示安装所有的组件;Custom表示根据用户自定义进行安装组件,可以更改默认的安装路径,此类型更为灵活。
(3) 然后点击“Next”按钮进入下一个安装步骤,选择安装目录和“Developer Components”组件如图5所示。
(4) 在安装过程中,通常选择默认选项,点击“Next”按钮进入下一步。同时,读者也可以根据自己的电脑环境及喜好进行配置,图6选择手动准确配置(Detailed Configuration)。
(5) 继续点击“Next”按钮下一步,在MySQL应用类型选择界面中,提供三种方式:
- Developer Machine(开发机),使用最小数量的内存。
- Server Machine(服务器),使用中等大小的内存。
- Dedicated MySQL Server Machine(专用服务器),当前可用的最大内存。
(6) 点击“Next”下一步按钮,进入数据库用途选择界面,这里作者选择“Multifunctional Database”,表示多功能数据库,此选项对事务性和非事务性存储引擎的存取速度都很快。
(7) 然后点击“Next”按钮,进入并发连接设置页面,选择“Decision Support(DSS)/ OLAP”,它表示决策支持系统,设置数据库访问量连接数为15(默认),如图9所示。
(8) 设置MySQL端口号为3306(默认),再点击下一步。其中MySQL调用的端口号为3306,如图10所示。
(9) 设置编码方式为utf-8(中文编码),如图11选择字符集“Character Set”为utf8。
读者需要注意,软件开发过程中的编码乱码问题是一个常见的典型问题,尤其是处理中文字符,而其解决方法的核心思想是将所有开发环境的编码方式设置为一致,通常将数据库、Python、HTML源码、前端浏览器等编码方式都配置成UTF-8中文编码方式。其中MySQL数据库设置编码方式为utf-8的过程如下图所示,否则数据库存储或查询中文汉字时,可能出现乱码错误。
(10) 点击“Next”按钮,进入Windows选项设置界面,再单击“Next”按钮进入安全选项配置界面,超级用户root的密码通常设置为“123456”,如下图12所示。
(11) 点击“Next”按钮,进入准备执行界面,等待MySQL安装配置,当所有的选项都打上勾显示成功的时候表示MySQL安装成功,如图13所示,最后点击“Finish”完成全部安装。
至此,MySQL数据库安装完成,Windows的“所有程序”菜单中已经多了MySQL选项。
2.SQL语句详解
数据库中最重要的就是SQL语句,它是结构化查询语言,英文Structure Query Language的缩写,SQL是使用关系模型的数据库应用语言。在MySQL安装成功后,我们将详细介绍SQL语句,并通过MySQL软件介绍SQL语句的基础用法及对应代码。
SQL语句主要划分为三种类别。
- DDL(Data Definition Language)语句 数据定义语言。该语句定义了不同的数据字段、数据库、数据表、列、索引等数据库对象。常用语句关键字包括create、drop、alter等。
- DML(Data Manipulation Language)语句 数据库操纵语句。该语句用于插入、删除、更新和查询数据库的记录,是数据库操作最常用的语句,并检查数据完整性。常用的语句关键字包括insert、delete、update和select。
- DCL(Data Control Language)语句 数据控制语句。该语句用于控制不同数据字段的许可和访问级别,定义了数据库、表、字段、用户的访问权限和安全级别。常用的语句关键字包括grant、revoke等。
下面结合我们安装的MySQL软件具体的讲解SQL语句的用法。
首先,运行MySQL并输入默认的用户密码“123456”,如图14所示。
(1) 显示数据库 输入“show databases”语句,查看当前MySQL数据库中存在的所有数据库,如果某个数据库已经存在,则可以使用use语句直接使用;如果数据库不存在,则第一次需要使用create语句创建数据库。
代码语言:javascript复制mysql> show databases;
---------------------------------
| Database |
---------------------------------
| information_schema |
| mysql |
| performance_schema |
| test |
| test01 |
| yxz |
---------------------------------
6 rows in set (0.03 sec)
(2) 使用数据库 如果想直接使用已经存在的数据库test01,则直接使用如下语句。
代码语言:javascript复制mysql> use test01;
Database changed
(3) 创建数据库 创建数据库语句是:
- create database 数据库名字
如果想创建新的数据库,使用create关键字创建。创建成功后,再调用use关键词选择该数据库进行使用,代码如下:
代码语言:javascript复制mysql> create database bookmanage;
Query OK, 1 row affected (0.00 sec)
mysql> use bookmanage;
Database changed
图15显示创建数据库“bookmanage”图书管理系统及选择数据库。
这里同样可以使用“show tables”语句显示该数据库中所有存在的表,但是目前还没有一张表,故返回“Empty set”。
(4) 创建表 创建表使用:
- create table 表名 (字段名 字段类型 约束条件…)
例如创建books图书表,包括图书编号bookid、图书名称bookname、价格price、图书日期bookdate等字段。代码如下所示:
代码语言:javascript复制create table books(bookid int primary key,
bookname varchar(20),
price float,
bookdate date);
其中创建的表名称为books,图书编号为int类型,同时为主键(primary key),用于唯一标识表的字段;图书名称为varchar类型,长度为20;价格为浮点型float;图书日期为date类型。详细介绍推荐大家课后去学习,这里只是入门讲解。
(5) 查看表信息 如果想查看当前数据库存在多少张表,则使用show关键字。
代码语言:javascript复制mysql> show tables;
---------------------------------
| Tables_in_bookmanage |
---------------------------------
| books |
---------------------------------
1 row in set (0.00 sec)
当前仅存在一张表books。如果想查看某张表的定义,则使用desc关键字。
代码语言:javascript复制desc books;
运行结果如下图17所示,显示了图书表的详细信息。
desc命令可以查看表的定义,但是如果想查看表更全面的信息,则通过更深入的SQL语句,比如通过查看创建表的SQL语句。
(6) 删除表 如果想要删除表books,使用“drop”关键词。
代码语言:javascript复制drop table books;
(7) 插入语句 当数据库和表创建成果后,需要向表中插入数据,使用的insert关键字。
代码语言:javascript复制insert into 表名(字段1,字段2,...) values(值1,值2,...)
比如向books图书表中插入信息,代码如下:
代码语言:javascript复制insert into books(bookid, bookname, price, bookdate)
values('1', '平凡的世界', '29.8', '2017-06-10');
使用select查询语句显示结果如图19所示,后面详细介绍select语句。
在执行insert插入过程中,如果省略所有字段,只需要values值一一对应即可。
代码语言:javascript复制mysql> insert into books
-> values('2', '活着', '25.0', '2017-06-11');
如图20所示,插入第二本书《活着》,select显示的结果为两本书的详细信息。
同理,如果只想插入某几个字段的数据,只需要对应一致即可,比如查询书序号和书名《钢铁是怎样炼成的》。
代码语言:javascript复制mysql> insert into books(bookid, bookname)
-> values('3', '钢铁是怎样炼成的');
运行结果如图21所示,《钢铁是怎样炼成的》书籍中,省略的字段价格(price)和日期(bookdate)字段显示为NULL空值。
(8) 查询语句 查询语句基本语法是:
- select 字段 from 表名 [where 条件]
该语句用于查询指定字段的数据,当字段为星号时,它用于查询表中的所有字段;where紧跟着查询条件,该参数可以省略。最简单的查询语句如下所示,将显示books表中的所有字段和数据,包括三本书籍的详细信息。
代码语言:javascript复制mysql> select * from books;
-------- --------------------------------------------- -------- -------------------
| bookid | bookname | price | bookdate |
-------- --------------------------------------------- -------- -------------------
| 1 | 平凡的世界 | 29.8 | 2017-06-10 |
| 2 | 活着 | 25 | 2017-06-11 |
| 3 | 钢铁是怎样炼成的 | NULL | NULL |
-------- -------------------------------------------- --------- --------------------
3 rows in set (0.00 sec)
如果想显示需要的字段,则可以用逗号分隔,如下所示:
代码语言:javascript复制select bookid,bookname,price from books;
显示结果如图22所示,其中bookdate字段没有显示出来。
如果需要增加查询条件,则使用where语句即可,比如查询编号大于1的书籍、查询价格非空的书籍,代码如下:
代码语言:javascript复制select bookid,bookname,price,bookdate from books where bookid>1;
select bookid,bookname,price,bookdate from books where price is not null;
显示结果如图23所示,第一条语句显示编号为2和3的结果,第二条语句显示图书价格不为空的结果。
更多的查询语句希望读者自己去研究,包括排序、group by分组、子查询等,同时后面数据分析部分,会结合实际应用介绍数据库查询语句及可视化分析处理。
(9) 更新语句 更新语句使用update关键字,基本格式是:
- update 表名 set 字段=新值 [where 条件]
例如将《活着》书名更新为《朝花夕拾》,代码如下:
代码语言:javascript复制update books set bookname=’朝花夕拾’ where bookname=’活着’;
运行结果如图24所示,其中图书序号为2的信息进行了更新。
(10) 删除语句 删除语句使用delete关键字,其基本格式是:
- delete from 表名 where 条件;
例如将价格为空的数据删除,使用的条件是“where price is null”,代码如下:
代码语言:javascript复制delete from books where price is null;
运行结果如图25所示,可以看到第三本书《钢铁是怎样炼成的》已经被删除。
此时,MySQL数据库的基础知识就介绍完了,更多知识推荐读者下来自行补充学习,比如结合 Navicat for MySQL
工具可视化结合。下面将介绍Python调用MySQL及操作。
二.Python操作MySQL数据库
Python访问数据库需要对应的接口程序,我们可以把接口程序理解为Python的一个模块,它提供了数据库客户端的接口供您访问。本小节主要介绍了Python操作MySQL数据库,通过调用MySQLdb扩展包操作数据库。
1.安装MySQL扩展包
首先需要在Python环境下安装MySQL扩展包,有两种方法。
第一种方法:通过“pip install mysql”安装Python的MySQL库。
但是使用该方法可能会遇到一些错误,如“Microsoft Visual C 9.0 is required (Unable to find vcvarsall.bat)”等,这些错误可能来自于驱动等问题。可以安装一个Micorsoft Visual C Compiler for Python 2.7包解决。请读者百度自行解决,通常为路径错误或版本需要升级。
第二种方法:从Python官网下载安装文件(推荐该方法)。 假设已经下载了一个whl文件,然后安装该文件。
- https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
- https://pypi.python.org/pypi/MySQL-python/
安装过程如下图所示。
同样,可以下载MySQL-python-1.2.3.win-amd64-py2.7.exe文件安装,如下图所示。
2.程序接口DB-API
接着给大家介绍Python操作MySQL数据库的API接口。Python接口程序一定要遵守Python DB-API规范。DB-API定义了一系列必须的操作对象和数据库存取方式,以便为各种各样的底层数据库系统和不同的数据库接口程序提供一致的访问接口。由于DB-API为不同的数据库提供了一致的访问接口,这让它在不同的数据库之间移植代码成为一件轻松的事情。
下面简单介绍DB-API的使用方法。
- 模块属性 一个DB-API模块的定义如表1所示。
- 连接数据库函数 连接数据库的函数是connect()函数,其生成一个connect对象,用于访问数据库。Connect()函数的参数如表2所列。
下面是Python导入MySQLdb扩展包,调用connect()函数连接数据库的代码。
代码语言:javascript复制import MySQLdb
conn = MySQLdb.connect(host='localhost', db='bookmanage', user='root',
passwd='123456', port=3306, charset='utf8')
MySQLdb扩展包的connect对象常用方法如表3所示。
commit()、rollback()、cursor()方法对于支持事务(Transaction)的数据库更有意义,事务是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行,从而保证数据的完整性和安全性。
- 游标对象 上面说了connect()方法用于提供连接数据库的接口,如果要对数据库操作那么还需要使用游标对象,游标对象的属性和方法如表4所示。
下面通过简单的示例进行讲解。
3.Python调用MySQLdb扩展包
前面我们创建了数据库“bookmanage”和表“books”,它们用来记录书籍管理系统中的书籍信息,接下来讲解怎样通过Python来显示。
(1) 查询数据库名称 首先,我们查看本地数据库中所包含的数据库名称,使用“show databases”语句。代码如下:
代码语言:javascript复制import MySQLdb
try:
conn=MySQLdb.connect(host='localhost',user='root',
passwd='123456',port=3306)
cur=conn.cursor()
res = cur.execute('show databases')
print(res)
for data in cur.fetchall():
print('%s' % data)
cur.close()
conn.close()
except MySQLdb.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
调用 MySQLdb.connect()
访问用户root本地MySQL数据库,其默认密码为“123456”。然后调用cur.execute(‘show databases’)执行显示所有数据库的语句,返回结果通过循环获取,如图29所示。
如果本地数据库已经存在,并且读者忘记其数据库的名称,可以通过该方法查询数据库中所包含所有数据库,再连接该数据库进行相关的操作。
(2) 查询表 这里我们需要查询“bookmanage”数据库中的书籍表(books)内容,代码如下:
代码语言:javascript复制# coding:utf-8
# By:Eastmount CSDN
import MySQLdb
try:
conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',
port=3306, db='bookmanage', charset='utf8')
cur = conn.cursor()
res = cur.execute('select * from books')
print('表中包含', res, u'条数据n')
for data in cur.fetchall():
print('%s %s %s %s' % data)
cur.close()
conn.close()
except MySQLdb.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
代码通过connect()函数连接数据库,通过cursor()函数定义游标,然后调用游标的 excute(‘select * from books’) 执行数据库操作,此处为查询操作,再通过fetchall()函数获取所有数据。其中查询语句为“select * from books”,查找books表中所有数据,输出结果如下:
代码语言:javascript复制>>>
表中包含 2 条数据
1 平凡的世界 29.8 2017-06-10
2 朝花夕拾 25 2017-06-11
>>>
对应的MySQL中的结果是一致的,图30是对应的结果。
(3) 新建表 下面创建一张学生表,主要是调用commit()函数提交数据,执行create table语句操作。
代码语言:javascript复制# coding:utf-8
# By:Eastmount CSDN
import MySQLdb
try:
conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',
port=3306, db='bookmanage', charset='utf8')
cur = conn.cursor()
sql = '''create table student(id int not null primary key auto_increment,
name char(30) not null,
sex char(20) not null
)'''
cur.execute(sql)
#查看表
print('插入后包含表:')
cur.execute('show tables')
for data in cur.fetchall():
print('%s' % data)
cur.close()
conn.commit()
conn.close()
except MySQLdb.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
输出结果如下所示,包括书籍表和学生表,其中学生表包括序号、姓名和性别。
代码语言:javascript复制>>>
插入后包含表:
books
student
>>>
(4) 插入数据 插入数据也是定义好SQL语句,调用execute(sql)方法实现。核心代码是:
代码语言:javascript复制cur.execute("insert into student values( '3', 'xiaoyang', '男')")
通常插入的新数据需要通过变量进行赋值,其值不是固定的,参考文件。
代码语言:javascript复制# coding:utf-8
# By:Eastmount CSDN
import MySQLdb
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',
port=3306, db='bookmanage', charset='utf8')
cur=conn.cursor()
#插入数据
sql = '''insert into student values(%s, %s, %s)'''
cur.execute(sql, ('3', 'xiaoyang', '男'))
#查看数据
print('n插入数据:')
cur.execute('select * from student')
for data in cur.fetchall():
print('%s %s %s' % data)
cur.close()
conn.commit()
conn.close()
except MySQLdb.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
输出结果如下:
代码语言:javascript复制>>>
插入数据:
3 xiaoyang 男
>>>
这里作者只讲述了这几种常见的数据库操作,其他SQL语句类似,请读者下来自行阅读实践。接下来讲解Python操作轻量型数据集Sqlite3。
三.Python操作Sqlite3数据库
SQLite是一款轻型数据库,是一种遵守事务ACID性质的关系型数据库管理系统,它占用的资源非常低,能够支持Windows/Linux/Unix等主流操作系统,同时能够跟很多程序语言如C#、PHP、Java、Python等相结合使用。
SQLite可以使用Sqlite3模块与Python进行集成,Sqlite3模块是由Gerhard Haring编写的,提供了一个与DB-API 2.0规范兼容的SQL接口。读者可以直接使用Sqlite3模块,因为Python 2.5.x 以上版本默认自带了该模块。
Sqlite3使用方法和前面介绍的MySQLdb库类似,首先必须创建一个数据库的连接对象,然后有选择地创建光标对象,再定义SQL语句进行执行,最后需要关闭对象和连接。Sqlite3常用方法如下所示:
- sqlite3.connect() 打开一个到SQLite数据库文件database的连接。
- connection.cursor() 创建一个cursor,将在Python数据库编程中用到。
- cursor.execute(sql) 执行一个sql语句,注意sql 语句可以被参数化使用。
- cursor.executescript(sql) 该例程一旦接收到脚本,会执行多个sql语句。sql语句应该用分号分隔。
- connection.commit() 提交当前的事务。
- connection.rollback() 回滚至上一次调用commit()对数据库所做的更改。
- connection.close() 关闭数据库连接。
- cursor.fetchone() 获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时,则返回 None。
- cursor.fetchmany() 获取查询结果集中的下一行组数据,返回一个列表。
- cursor.fetchall()
- 获取查询结果集中所有的数据行,返回一个列表。
下面这段代码是Python操作Sqlite3的基础用法,其语法基本和MySQLdb库类似。
代码语言:javascript复制#-*- coding:utf-8 -*-
# By:Eastmount CSDN
import sqlite3
#连接数据库:如果数据库不存在则创建
conn = sqlite3.connect('test6.db')
cur = conn.cursor()
print('数据库创建成功.n')
#创建表 PEOPLE(编号,姓名,年龄,公司,薪水)
cur.execute('''CREATE TABLE PEOPLE
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
COMPANY CHAR(50),
SALARY REAL);
''')
print("PEOPLE表创建成功.n")
conn.commit()
#插入数据
cur.execute("INSERT INTO PEOPLE (ID,NAME,AGE,COMPANY,SALARY)
VALUES (1, '小杨', 26, '华为', 10000.00 )");
cur.execute("INSERT INTO PEOPLE (ID,NAME,AGE,COMPANY,SALARY)
VALUES (2, '小颜', 26, '百度', 8800.00 )");
cur.execute("INSERT INTO PEOPLE (ID,NAME,AGE,COMPANY,SALARY)
VALUES (3, '小红', 28, '腾讯', 9800.00 )");
conn.commit()
print("数据插入成功.n")
#查询操作
cursor = cur.execute("SELECT id, name, age, company, salary from PEOPLE")
print("数据查询成功.")
print("序号", "姓名", "年龄", "公司", "薪水")
for row in cursor:
print(row[0], row[1], row[2], row[3], row[4])
print('')
#更新操作
cur.execute("UPDATE PEOPLE set COMPANY = '华为' where ID=2")
conn.commit()
print("数据更新成功.")
cursor = cur.execute("SELECT id, name, company from PEOPLE")
for row in cursor:
print(row[0], row[1], row[2])
print('')
#删除操作
cur.execute("DELETE from PEOPLE where COMPANY='华为';")
conn.commit()
print("数据删除成功.")
cursor = cur.execute("SELECT id, name, company from PEOPLE")
for row in cursor:
print(row[0], row[1], row[2])
print('')
#关闭连接
conn.close()
输出结果如图31所示:
其步骤如下:
- 1.在本地创建一个test6.db的数据库文件。
- 2.执行游标中的execute()函数,创建了PEOPLE表,包括编号、姓名、年龄、公司、薪水等字段,字段涉及各种数据类型。
- 3.执行插入数据库操作,注意需要调用conn.commit()函数提交执行。
- 4.执行查询操作,SQL语句为“SELECT id, name, age, company, salary from PEOPLE”,然后通过for循环获取查询的结果,显示“小杨”、“小颜”、“小红”的信息。
- 5.执行更新操作并查询数据结果,将编号为“2”的公司信息更改为“华为”。
- 6.执行删除操作,删除公司名称为“华为”的数据,最后剩下“小红”的信息。
更多数据库实际操作将在后面的数据分析章节和爬虫部分进行详细介绍,同时推荐读者深入研究Python操作数据库的知识,包括事务、存储过程、触发器等内容。
四.总结
数据库是按照数据结构来组织、存储和管理数据的仓库,用户可以通过数据库来存储和管理所需的数据,包括简单的数据表格、海量数据等。数据库被广泛应用于各行各业,比如信息管理系统、办公自动化系统、各种云信息平台等。
为什么要介绍Python操作数据库呢?
- 一方面,数据爬取、数据存储、数据分析、数据可视化是密不可分的四个部分,当我们爬取了相关数据之后,需要将其存储至数据库中,这能够更加标准化、智能化、自动化、便捷地管理数据,也为后续的数据分析提供强大的技术支撑,能够自定义提取所需数据块进行分析;
- 另一方面,数据库为数据共享,实现数据集中控制,保证数据的一致性和可维性提供保障。所以学习Python操作数据库是非常必要的,也希望读者认真学习本章内容,掌握Python操作MySQL数据库、Sqlite3轻量型数据库知识,并应用到自己的科研项目中去。
该系列所有代码下载地址:
- https://github.com/eastmountyxz/Python-zero2one
参考文献如下:
- [1] 作者书籍《Python网络数据爬取及分析从入门到精通》
- [2] MySQL官网. ttps://www.mysql.com/.
- [3] [python] 专题九.Mysql数据库编程基础知识 Eastmount
- [4] http://blog.csdn.net/column/details/14842.html
- [5] http://www.runoob.com/sqlite/sqlite-python.html
- [6] http://blog.csdn.net/eastmount/article/details/61914613