问题:
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的子类。