问题:

python的开源和扩展性的优势,具体结合mysql如何体现?

解决方案:

在win7上安装mysql,相对比较复杂。

安装python第三方库mysqldb。

调用mdb.connect、commit、rollback、close、cursor、fetchone、fetchall、execute以及sql语句。

可以通过登录mysql查看数据库情况进行对比。

讨论:

安装mysql的坑真心多,希望可以简化。

安装python的MySQLdb模块,建议用exe执行文件,尝试用source文件执行python setup.py install 失败。

python不能创建数据库,操作对象必须是mysql中已创建好的数据库,python只负责连接,然后在对里面的表及内容进行操作。

mysql本身有脚本语言,可以很方便的增删改查,python其实也是调用的对应sql语句。

python的优势是跨平台,跨软件综合应用,将不同的库特性连接。


# -*- coding: utf-8 -*-
 import MySQLdb as mdb
 import sys



'''
MySQL安装在win下,真的有好多坑。。。。。。

添加环境变量 - C:\Program Files\MySQL\MySQL Server 5.7\bin
修改ini文件 - C:\Program Files\MySQL\MySQL Server 5.7\my.ini
    basedir=C:\Program Files\MySQL\MySQL Server 5.7
    datadir=C:\Program Files\MySQL\MySQL Server 5.7\Data
修改注册表 - regedit - [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySql] - ImagePath
    C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe --defaults-file="C:\Program Files\MySQL\MySQL Server 5.7\my.ini" MySQL

cmd:
    mysqld -remove
    mysqld -install
    mysqld --initialize  自动创建data文件夹
    net start mysql
    mysql -u root -p
    Enter password: (第一次登录没有密码,直接按回车,需要修改密码后以后才能登录)
    
重新设置password方法:
ini文件:
    [mysqld]
    skip-grant-tables (设置完password后需要删除)
cmd:
    mysql -u root
    mysql> flush privileges;
   mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
删除之前加入的my skip-grant-tables,保存退出。

重新登录
cmd:
    mysql -u root -p
    Enter password:newpass
    mysql>show databases;

运行sql脚本:
 1.编写sql脚本:
  create database dearabao;
  use dearabao;
  create table niuzi (name varchar(20));
  保存脚本文件,假设我把它保存在F盘的hello world目录下,于是该文件的路径为:F:\hello world\niuzi.sql
2.执行sql脚本,可以有2种方法:
  第一种方法:
 在命令行下(未连接数据库),输入 mysql -h localhost -u root -p123456 < F:\hello world\niuzi.sql
 (注意路径不用加引号的!!) 回车即可.
  第二种方法:
 在命令行下(已连接数据库,此时的提示符为 mysql> ),输入 source F:\hello world\niuzi.sql (注意路径不用加引号的)
 或者 \. F:\hello world\niuzi.sql (注意路径不用加引号的) 回车即可

'''
 print 'start\n'

 con = None
 db_ip = u'localhost'
 user = u'root'
 psd = u'Zte123'
 dbname = u'test'

 try:
     con = mdb.connect(db_ip, user, psd, dbname)
     cur = con.cursor()
     cur.execute('SELECT VERSION()')
     data = cur.fetchone()
     print u'版本号: %s' % data
     print u'清空数据库的表'
     cur.execute('DROP TABLE IF EXISTS EMPLOYEE')




     print u'增加数据库的表'
     sql = '''CREATE TABLE EMPLOYEE (
              FIRST_NAME  CHAR(20) NOT NULL,
              LAST_NAME  CHAR(20),
              AGE INT,  
              SEX CHAR(1),
              INCOME FLOAT )'''
     cur.execute(sql)

     print u'修改数据库的表'
     sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
              LAST_NAME, AGE, SEX, INCOME)
              VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
     #更新
     #sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
     try:
         cur.execute(sql)
         con.commit()
     except:
         con.rollback()

     

     print u'查看数据库的表'
 ##    使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据
     sql = "SELECT * FROM EMPLOYEE \
            WHERE INCOME > '%d'" % (1000)
     try:
        cur.execute(sql)
        results = cur.fetchall()
        for row in results:
          fname = row[0]
          lname = row[1]
          age = row[2]
          sex = row[3]
          income = row[4]
          print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
              (fname, lname, age, sex, income )
     except:
         print "Error: unable to fecth data"
     
     print u'删除数据库的表'
     sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
     try:
         cur.execute(sql)
         con.commit()
     except:
         con.rollback()
         
     print u'再次查看数据库的表'
 ##    使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据
     sql = "SELECT * FROM EMPLOYEE \
            WHERE INCOME > '%d'" % (1000)
     try:
        cur.execute(sql)
        results = cur.fetchall()
        for row in results:
          fname = row[0]
          lname = row[1]
          age = row[2]
          sex = row[3]
          income = row[4]
          print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
              (fname, lname, age, sex, income )
     except:
         print "Error: unable to fecth data"

 except BaseException,e:
     print e
     pass
 finally:
     if con:
         con.close()




##事务机制可以确保数据一致性。
##
##事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
##
##    原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
##    一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
##    隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
##    持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
##
##Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。


##异常    描述
##Warning    当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
##Error    警告以外所有其他错误类。必须是 StandardError 的子类。
##InterfaceError    当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。
##DatabaseError    和数据库有关的错误发生时触发。 必须是Error的子类。
##DataError    当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。
##OperationalError    指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。
##IntegrityError    完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。
##InternalError    数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。
##ProgrammingError    程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。
##NotSupportedError    不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。