在Python网络爬虫中,通常是通过TXT纯文本方式存储,其实也是可以存储在数据库中的;同时在WAMP(Windows、Apache、MySQL、PHP或Python)开发网站中,也可以通过Python构建网页的,所以这篇文章主要讲述Python调用MySQL数据库相关编程知识。从以下几个方面进行讲解:
1.配置MySLQ
2.SQL语句基础知识
3.Python操作MySQL基础知识
4.Python调用MySQL示例
首先下载mysql-5.0.96-winx64,安装过程如下图所示。
1.安装MySQL 5.0
2.选择手动配置、服务类型、通用多功能型和安装路径
3.设置数据库访问量连接数为15、端口为3306(代码中设置URL用到)、编码方式为utf-8
4.设置默认超级root用户的用户名和密码,最后安装成功
安装MySQL 5.0成功后,进行数据库的简单操作。
1.运行MySQL输入默认用户密码123456
Enter password: ******
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| test01 |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test01;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table student(username varchar(20),
-> password varchar(20),
-> stuid int primary key);
Query OK, 0 rows affected (0.33 sec)
mysql> show tables;
+------------------+
| Tables_in_test01 |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| password | varchar(20) | YES | | NULL | |
| stuid | int(11) | NO | PRI | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.03 sec)
mysql> insert student(username, password, stuid)
-> values('eastmount','123456',1)
-> ;
Query OK, 1 row affected (0.05 sec)
mysql> select * from student;
+-----------+----------+-------+
| username | password | stuid |
+-----------+----------+-------+
| eastmount | 123456 | 1 |
+-----------+----------+-------+
1 row in set (0.00 sec)
mysql> update student set password='000000' where stuid='1';
Query OK, 1 row affected (0.10 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from student;
+-----------+----------+-------+
| username | password | stuid |
+-----------+----------+-------+
| eastmount | 000000 | 1 |
+-----------+----------+-------+
1 row in set (0.00 sec)
mysql> delete from student where username='eastmount';
Query OK, 1 row affected (0.08 sec)
mysql> select * from student;
Empty set (0.00 sec)
mysql>
apilevel:模块兼容的DB-API版本号
threadsafety:线程安全级别
paramstyle:支持sql语句参数风格
connect():连接数据库
Python调用MsSQL需要导入MySQLdb库,如下:
import MySQLdb
2.connect()函数
其中主要使用的方法是connect对象。connect()方法生成一个connect对象,用于访问数据库,其参数如下:
user:Username
password:Password
host:Hostname
database:DatabaseName
dsn:Data source name
注意并非所有的接口程序都严格按照这种格式,如MySQLdb。
import MySQLdb
conn = MySQLdb.connect(host='localhost', db='test01', user='root', passwd='123456', port=3306, charset='utf8')
connect()对象方法如下:
lose():关闭数据库连接,或者关闭游标对象
commit():提交当前事务
rollback():取消当前事务
cursor():创建游标或类游标对象
errorhandler(cxn,errcls,errval):作为已给游标的句柄
注意,执行close()方法则上述的连接对象方法不能再使用,否则发生异常。commit()、rollback()、cursor()或许更对于支持事务的数据库更有意义。
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。 一旦你完成了数据库连接,关闭了游标对象,然后在执行commit()提交你的操作,然后关闭连接。
3.游标对象
上面说了connect()方法用于提供连接数据库的接口,如果要对数据库操作那么还需要使用游标对象。游标对象的属性和方法:
fetchone():可以看作fetch(取出) one(一个),也就是得到结果集的下一行(一行)。
fetchmany(size):可以看作fetch(取出)many(多个),这里的参数是界限,得到结果集的下几行(几行)
fetchall():顾名思义,取得所有。
execute(sql):执行数据库操作,参数为sql语句。
close():不需要游标时尽可能的关闭
下面通过简单的示例进行讲解。
在前面数据库中我们创建了数据库“test01”和表“student”,同时插入了数据。那么,怎样通过Python来显示呢?
1.查询所有数据库
首先,我们查看本地数据库中所包含的数据库名称,通过“show databases”语句。
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,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
其中通过链接数据库代码为:
conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306)
访问root超级用户,其密码为“123456”,端口为“3306”,其结果如下:
如果不知道本地数据库的名称,可以通过该方法,先查询数据库中包含哪些数据库,然后再连接该数据库进行相关的操作。
2.查询表
下面介绍查询表student中数据,代码如下,代码的具体含义是通过connect()连接数据库,通过conn.cursor()定义游标,然后调用游标的excute(sql)执行数据库操作,此处为查询操作,再通过fetchall()函数获取所有数据。
# coding:utf-8
import MySQLdb
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01', charset='utf8')
cur=conn.cursor()
res = cur.execute('select * from student')
print u'表中包含',res,u'条数据\n'
print u'数据如下:(姓名 密码 序号)'
for data in cur.fetchall():
print '%s %s %s' % data
cur.close()
conn.close()
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
输出结果如图所示:
对应的MySQL中的结果是一致的,下图是对应的结果。
# coding:utf-8
import MySQLdb
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01', charset='utf8')
cur=conn.cursor()
#查看表
print u'插入前包含表:'
cur.execute('show tables')
for data in cur.fetchall():
print '%s' % data
#插入数据
sql = '''create table teacher(id int not null primary key auto_increment,
name char(30) not null,
sex char(20) not null
)'''
cur.execute(sql)
#查看表
print u'\n插入后包含表:'
cur.execute('show tables')
for data in cur.fetchall():
print '%s' % data
cur.close()
conn.commit()
conn.close()
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
输出结果如下所示,插入教师表,包含字段:教师序号(id)、教师名称(name)、教师性别(sex)。
插入数据也可以通过execute(sql)方法实现,如:
cur.execute("insert into student values( 'yxz', '111111', '10')")
但插入的新数据通常是通过变量进行赋值,而不是固定的,所以要对这条语句中的值做修改。我们可以做如下修改:
# coding:utf-8
import MySQLdb
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01')
cur=conn.cursor()
#插入数据
sql = '''insert into student values(%s, %s, %s)'''
cur.execute(sql, ('yxz','111111', '10'))
#查看数据
print u'\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,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
输出结果如下所示:
>>>
插入数据:
esatmount 123456 1
yangxiuzhang 123456 2
xiaoy 123456 3
yxz 111111 10
>>>
同样,对数据库的增删改插都可以进行,请读者自行阅读。
推荐资料:python使用mysql数据库 - 虫师
后面我会结合Python爬虫讲述,如何将爬取的内容存储在数据库中,如我CSDN的博客,爬取博客标题、发布时间、阅读量和评论数。