[python] 专题九.Mysql数据库编程基础知识

转自:[python] 专题九.Mysql数据库编程基础知识


        在Python网络爬虫中,通常是通过TXT纯文本方式存储,其实也是可以存储在数据库中的;同时在WAMP(Windows、Apache、MySQL、PHP或Python)开发网站中,也可以通过Python构建网页的,所以这篇文章主要讲述Python调用MySQL数据库相关编程知识。从以下几个方面进行讲解:
        1.配置MySLQ
        2.SQL语句基础知识
        3.Python操作MySQL基础知识
        4.Python调用MySQL示例



一. 配置MySQL

       
        首先下载mysql-5.0.96-winx64,安装过程如下图所示。
        1.安装MySQL 5.0
 

 

        2.选择手动配置、服务类型、通用多功能型和安装路径
 

 

        3.设置数据库访问量连接数为15、端口为3306(代码中设置URL用到)、编码方式为utf-8
 

 

        4.设置默认超级root用户的用户名和密码,最后安装成功
 


二. SQL语句基础知识


        安装MySQL 5.0成功后,进行数据库的简单操作。
        1.运行MySQL输入默认用户密码123456


         
2.创建数据库test01和使用数据库(第二次调用直接use database)
         create database test01;



        
显示数据库中包含的数据库:show databases;


         3.创建表student,其中学号为主键
         create table student(username varchar(20),password varchar(20),stuid int primary key);



        
4.显示表结构,使用语句desc student


        
5.向学生表中插入数据并显示查询的数据


        
6.删除表:drop table student;


        7.更新数据
        update student set password=’000000’ where stuid=’1’;


        8.删除数据
        Delete from student where username=’eastmount;


        此时MySQL操作数据库基本讲解结束,你同样可以实现数据库的增删改查、事务、存储过程等操作,建议安装可视化的软件来替代黑框,或使用Navicat for MySQL软件即可。代码如下:


  1. Enter password: ******  
  2. mysql> show databases;  
  3. +--------------------+  
  4. Database           |  
  5. +--------------------+  
  6. | information_schema |  
  7. | mysql              |  
  8. | performance_schema |  
  9. | test               |  
  10. | test01             |  
  11. +--------------------+  
  12. rows in set (0.00 sec)  
  13.   
  14. mysql> use test01;  
  15. Database changed  
  16. mysql> show tables;  
  17. Empty set (0.00 sec)  
  18.   
  19. mysql> create table student(username varchar(20),  
  20.     ->                  password varchar(20),  
  21.     ->                  stuid int primary key);  
  22. Query OK, 0 rows affected (0.33 sec)  
  23.   
  24. mysql> show tables;  
  25. +------------------+  
  26. | Tables_in_test01 |  
  27. +------------------+  
  28. | student          |  
  29. +------------------+  
  30. 1 row in set (0.00 sec)  
  31.   
  32. mysql> desc student;  
  33. +----------+-------------+------+-----+---------+-------+  
  34. | Field    | Type        | Null | Key | Default | Extra |  
  35. +----------+-------------+------+-----+---------+-------+  
  36. | username | varchar(20) | YES  |     | NULL    |       |  
  37. password | varchar(20) | YES  |     | NULL    |       |  
  38. | stuid    | int(11)     | NO   | PRI | NULL    |       |  
  39. +----------+-------------+------+-----+---------+-------+  
  40. rows in set (0.03 sec)  
  41.   
  42. mysql> insert student(username, password, stuid)  
  43.     -> values('eastmount','123456',1)  
  44.     -> ;  
  45. Query OK, 1 row affected (0.05 sec)  
  46.   
  47. mysql> select * from student;  
  48. +-----------+----------+-------+  
  49. | username  | password | stuid |  
  50. +-----------+----------+-------+  
  51. | eastmount | 123456   |     1 |  
  52. +-----------+----------+-------+  
  53. 1 row in set (0.00 sec)  
  54.   
  55. mysql> update student set password='000000' where stuid='1';  
  56. Query OK, 1 row affected (0.10 sec)  
  57. Rows matched: 1  Changed: 1  Warnings: 0  
  58.   
  59. mysql> select * from student;  
  60. +-----------+----------+-------+  
  61. | username  | password | stuid |  
  62. +-----------+----------+-------+  
  63. | eastmount | 000000   |     1 |  
  64. +-----------+----------+-------+  
  65. 1 row in set (0.00 sec)  
  66.   
  67. mysql> delete from student where username='eastmount';  
  68. Query OK, 1 row affected (0.08 sec)  
  69.   
  70. mysql> select * from student;  
  71. Empty set (0.00 sec)  
  72.   
  73. mysql>  



三. Python调用MySQL基础知识


        通常的安装方法是使用:pip install mysql 安装Python的MySQL库,但是总会报错。常见错误如:
        Microsoft Visual C++ 9.0 is required  (Unable to find vcvarsall.bat)
        
mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory
        这些可能是驱动等问题。



        正确安装方法:
        建议下载一个
MySQL-python-1.2.3.win-amd64-py2.7.exe文件进行安装。
        官网地址:https://pypi.python.org/pypi/MySQL-python/

                        http://www.codegood.com/archives/129
        下载地址:http://download.csdn.net/detail/eastmount/9598651




        下面我们要详细了解Python数据库API。从Python中访问数据库需要接口程序,接口程序是一个Python模块,它提供数据库客户端库(通常是C语言写成的)的接口供你访问。注意:Python接口程序都一定要遵守Python DB-API规范。
        DB-API是一个规范。它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。DB-API为不同的数据库提供了一致的访问接口,在不同的数据库之间移植代码成为一件轻松的事情。
         下面简单介绍DB-API的使用方法。
        1.模块属性
        DB-API规范里的以下特性和属性必须提供。一个DB-API兼容模块定义如下所示:


  1. apilevel:模块兼容的DB-API版本号  
  2. threadsafety:线程安全级别  
  3. paramstyle:支持sql语句参数风格  
  4. connect():连接数据库  
        Python调用MsSQL需要导入MySQLdb库,如下:


  1. import MySQLdb  
        2.connect()函数
        其中主要使用的方法是connect对象。connect()方法生成一个connect对象,用于访问数据库,其参数如下:

  1. user:Username  
  2. password:Password  
  3. host:Hostname  
  4. database:DatabaseName  
  5. dsn:Data source name  
        注意并非所有的接口程序都严格按照这种格式,如MySQLdb。

  1. import MySQLdb  
  2. conn = MySQLdb.connect(host='localhost', db='test01', user='root', passwd='123456', port=3306, charset='utf8')  
        connect()对象方法如下:

  1. lose():关闭数据库连接,或者关闭游标对象  
  2. commit():提交当前事务  
  3. rollback():取消当前事务  
  4. cursor():创建游标或类游标对象  
  5. errorhandler(cxn,errcls,errval):作为已给游标的句柄  
        注意,执行close()方法则上述的连接对象方法不能再使用,否则发生异常。commit()、rollback()、cursor()或许更对于支持事务的数据库更有意义。
        数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。 一旦你完成了数据库连接,关闭了游标对象,然后在执行commit()提交你的操作,然后关闭连接。

        3.游标对象
        上面说了connect()方法用于提供连接数据库的接口,如果要对数据库操作那么还需要使用游标对象。游标对象的属性和方法:

  1. fetchone():可以看作fetch(取出) one(一个),也就是得到结果集的下一行(一行)。  
  2. fetchmany(size):可以看作fetch(取出)many(多个),这里的参数是界限,得到结果集的下几行(几行)  
  3. fetchall():顾名思义,取得所有。  
  4. execute(sql):执行数据库操作,参数为sql语句。  
  5. close():不需要游标时尽可能的关闭  
        下面通过简单的示例进行讲解。



四. Python调用MySQL示例


        在前面数据库中我们创建了数据库“test01”和表“student”,同时插入了数据。那么,怎样通过Python来显示呢?
       1.查询所有数据库
        首先,我们查看本地数据库中所包含的数据库名称,通过“show databases”语句。


  1. import MySQLdb  
  2.    
  3. try:  
  4.     conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306)  
  5.     cur=conn.cursor()  
  6.     res = cur.execute('show databases')  
  7.     print res  
  8.     for data in cur.fetchall():  
  9.         print '%s' % data  
  10.     cur.close()  
  11.     conn.close()  
  12. except MySQLdb.Error,e:  
  13.      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()函数获取所有数据。

  1. # coding:utf-8   
  2. import MySQLdb  
  3.    
  4. try:  
  5.     conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01', charset='utf8')  
  6.     cur=conn.cursor()  
  7.     res = cur.execute('select * from student')  
  8.     print u'表中包含',res,u'条数据\n'  
  9.     print u'数据如下:(姓名 密码 序号)'  
  10.     for data in cur.fetchall():  
  11.         print '%s %s %s' % data  
  12.     cur.close()  
  13.     conn.close()  
  14. except MySQLdb.Error,e:  
  15.      print "Mysql Error %d: %s" % (e.args[0], e.args[1])  
        输出结果如图所示:

        对应的MySQL中的结果是一致的,下图是对应的结果。

        3.创建表
        下面这段代码是创建一张教师表,主要是通过commit()提交数据。

  1. # coding:utf-8   
  2. import MySQLdb  
  3.    
  4. try:  
  5.     conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01', charset='utf8')  
  6.     cur=conn.cursor()  
  7.       
  8.     #查看表  
  9.     print u'插入前包含表:'  
  10.     cur.execute('show tables')  
  11.     for data in cur.fetchall():  
  12.         print '%s' % data  
  13.   
  14.     #插入数据  
  15.     sql = '''''create table teacher(id int not null primary key auto_increment, 
  16.                                 name char(30) not null, 
  17.                                 sex char(20) not null 
  18.           )'''  
  19.     cur.execute(sql)  
  20.   
  21.     #查看表  
  22.     print u'\n插入后包含表:'  
  23.     cur.execute('show tables')  
  24.     for data in cur.fetchall():  
  25.         print '%s' % data  
  26.     cur.close()  
  27.     conn.commit()  
  28.     conn.close()  
  29. except MySQLdb.Error,e:  
  30.      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')")
        但插入的新数据通常是通过变量进行赋值,而不是固定的,所以要对这条语句中的值做修改。我们可以做如下修改:

  1. # coding:utf-8   
  2. import MySQLdb  
  3.    
  4. try:  
  5.     conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01')  
  6.     cur=conn.cursor()  
  7.       
  8.     #插入数据  
  9.     sql = '''''insert into student values(%s, %s, %s)'''  
  10.     cur.execute(sql, ('yxz','111111''10'))  
  11.   
  12.     #查看数据  
  13.     print u'\n插入数据:'  
  14.     cur.execute('select * from student')  
  15.     for data in cur.fetchall():  
  16.         print '%s %s %s' % data  
  17.     cur.close()  
  18.     conn.commit()  
  19.     conn.close()  
  20. except MySQLdb.Error,e:  
  21.      print "Mysql Error %d: %s" % (e.args[0], e.args[1])  
        输出结果如下所示:

  1. >>>   
  2. 插入数据:  
  3. esatmount 123456 1  
  4. yangxiuzhang 123456 2  
  5. xiaoy 123456 3  
  6. yxz 111111 10  
  7. >>>   
        同样,对数据库的增删改插都可以进行,请读者自行阅读。
        推荐资料:python使用mysql数据库 - 虫师
        后面我会结合Python爬虫讲述,如何将爬取的内容存储在数据库中,如我CSDN的博客,爬取博客标题、发布时间、阅读量和评论数。



        MySQL数据库中结果如下图所示:


        最后希望文章对你有所帮助,如果文章中存在不足或错误的地方,还请海涵~还是那句话,挺享受现在的老师生活,不论科研、项目,还是教学,很充实,加油!
        但行好事,莫问前程。
        待随满天李桃,再追学友趣事。
        (By:Eastmount 2016-08-10 晚上10点  http://blog.csdn.net/eastmount/ )