mysql数据库现在已经成为市场占有率最高的数据库,在开发过程中,很多情况下我们都需要操作mysql,所以对于python操作mysql的了解是必不可少的。
Python标准数据库接口为Python DB-API, Python DB-API为开发人员提供了数据库应用 编程接口。
参考地址:https://wiki.python.org/moin/DatabaseInterfaces,你可以查看python支持数据库的详细列表。
不同的数据库需要下载不同的DB API模块。
DB-API是一个规范。它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。
Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同 的方式操作各数据库。
Python DB-API使用流程:
1.引入API模块。
2.获取与数据库的连接。
3.执行SQL语句和存储过程。
4.关闭数据库连接。
1. 安装所需要的包
MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。
如果是windows系统:登录 https://pypi.python.org/pypi/MySQL-python/1.2.5 找到.exe结尾的包;
下载安装就好了,然后在cmd中执行:
如果结果如上图所示,就说明你安装成功了,如果有如下报错信息,
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named MySQLdb
那是环境变量有问题,把安装刚才下载的.exe包的路径添加到环境变量中就可以了。
如果是linux系统,可以下载源码包进行安装:
链接中的zip包,然后安装:
# yum install –y python-devel
# yum install –y mysql-devel
# yum install –y gcc
解压:
# unzip MySQL-python-1.2.5.zip
# cd MySQL-python-1.2.5
# python setup.py build
# python setup.py install
# python
>>> import MySQLdb
2.数据库的连接
MySQLdb提供了connect方法用来和数据库建立连接,接收数个参数,返回连接对象:
平常我们在Mysql的数据库中手动建立python库的方法:
> create database python;
通过以下代码进行python库的连接:
conn=MySQLdb.connect(host="192.168.48.128",user="test",passwd="123456",db="python",port=3306,charset="utf8")
包含了几种参数:
host:数据库主机名.默认是用本地主机
user:数据库登陆名.默认是当前用户
passwd:数据库登陆的秘密.默认为空
db:要使用的数据库名.没有默认值
port:MySQL服务使用的TCP端口.默认是3306,数字类型
charset:数据库编码字符集
更多参数的信息可以查这里 http://mysql-python.sourceforge.net/MySQLdb.html
有时候,为了代码规范,推荐把所有数据库的配置写在一个字典中,如下所示:
def connect_mysql(): db_config = { ‘host‘: ‘192.168.48.128‘, ‘port‘: 3306, ‘user‘: ‘xiang‘, ‘passwd‘: ‘123456‘, ‘db‘: ‘python‘, ‘charset‘: ‘utf8‘ } cnx = MySQLdb.connect(**db_config) return cnx
这样写的代码更规范,即使以后数据库有协议,只需要改动 db_config 字典中的内容就可以了,后面的内容就不用改了,增加代码的可移植性;
也可以把 mysql 的连接包装成一个函数,以后在连接 mysql 的时候,直接调用函数就可以了!
3.Mysql事务
了解什么是mysql的事物
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如,你操作一个数据库,公司的一个员工离职了,你要在数据库中删除他的资料,也要删除该人员相关的,比如邮箱,个人资产等。这些数据库操作语言就构成了一个事务。在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务,所以很多情况下我们都使用innodb引擎。事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性:一组事务,要么成功;要么撤回。
2、稳定性 : 有非法数据(外键约束之类),事务撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。
mysql在默认的情况下,是把每个select,insert,update,delete等做为一个事务的,登录mysql服务器,进入mysql,执行以下命令:
mysql> show variables like ‘auto%‘;
+----------------------------------+--------+ | Variable_name | Value | +----------------------------------+--------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | | autocommit | ON | | automatic_sp_privileges | ON | +----------------------------------+--------+ 4 rows in set (0.00 sec)
如上所示:
有一个参数 autocommit 就是自动提交的意思,每执行一个msyql的 select,insert,update 等操作,就会进行自动提交。
如果把改选项关闭,我们就可以每次执行完一次代码就需要进行手动提交,connect 对象给我们提供了两种办法来操作提交数据。
4. mysql事务的方法
commit():提交当前事务,如果是支持事务的数据库执行增删改后没有commit则数据库默认回滚,白操作了
rollback():取消当前事务
下面我们来看个例子:
创建一个员工表:
> create table employees (
emp_no int not null auto_increment,
emp_name varchar(16) not null,
gender enum(‘M‘, ‘F‘) not null,
hire_date date not null,
primary key (emp_no)
);
emp_no: 员工id,为主键且唯一
emp_name: 员工的名字
fender: 性别,只有M和F两种选择
hire_date: 雇佣的时间。
插入几条数据:
> insert into employees(emp_no, emp_name, gender, hire_date) values(1001, ‘li‘, ‘M‘, ‘2015-04-01‘);
> insert into employees(emp_no, emp_name, gender, hire_date) values(1002, ‘xian‘, ‘M‘, ‘2015-04-01‘);
> insert into employees(emp_no, emp_name, gender, hire_date) values(1003, ‘sheng‘, ‘M‘, ‘2015-04-01‘);
> select * from employees;
+-----------+----------------+----------+----------------+ | emp_no | emp_name | gender | hire_date | +-----------+----------------+----------+----------------+ | 1001 | li | M | 2015-04-01 | | 1002 | xian | M | 2015-04-01 | | 1003 | sheng | M | 2015-04-01 | +-----------+----------------+----------+----------------+
通过python代码增加一条数据到数据库中,代码如下:
import MySQLdb def connect_mysql(): db_config = { ‘host‘: ‘192.168.48.128‘, ‘port‘: 3306, ‘user‘: ‘xiang‘, ‘passwd‘: ‘123456‘, ‘db‘: ‘python‘, ‘charset‘: ‘utf8‘ } cnx = MySQLdb.connect(**db_config) return cnx if __name__ == ‘__main__‘: cnx = connect_mysql() cus = cnx.cursor() sql = ‘‘‘ create table test(id int not null);insert into test(id) values (100);‘‘‘ try: cus.execute(sql) cus.close() cnx.commit() except Exception as e: cnx.rollback() print(‘Error‘) # raise e finally: cnx.close()
结果返回:
Error
查看数据库中的数据:select * from employees;
并没有发生变化
解释:
在我们插入数据雇佣时间字段 hire_date 的时候,故意把时间写错,导致异常发生,捕获到异常之后,打印 Error,最后关闭mysql连接。
cus = cnx.cursor() 的作用是创建一个游标对象。