python下的mysql操作分享
python的mysql操作
mysql是最流行的数据库之一,所以对于python操作mysql的了解是必不可少的。python标准数据库接口为python db-api, python db-api为开发人员提供了数据库应用 接口。
你可以查看python支持数据库的详细列表。不同的数据库需要下载不同的db api模块。
db-api是一个规范。它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库和多种多样的数据库接口程序提供一致的访问接口。python的db-api,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同 的方式操作各数据库。
python db-api使用流程:
1. 引入api模块。
2. 获取与数据库的连接。
3. 执行sql语句和存储过程。
4. 关闭数据库连接。
安装所需要的包
mysqldb 是用于python链接my的接口,它实现了 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 "", line 1, in
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
/usr/lib64/python2.7/site-packages/mysql_python-1.2.5-py2.7-linux-x86_64.egg/_mysql.py:3: userwarning: module _mysql was already imported from /usr/lib64/python2.7/site-packages/mysql_python-1.2.5-py2.7-linux-x86_64.egg/_mysql.pyc, but /usr/local/src/mysql-python-1.2.5 is being added to sys.path
如果出现类似的错误,原因是,install后mysqldb模块已经被放到python的site-pachages目录中;但我在当前目录也存在相同的模块,所以可能会重复导入。只要切换到其他目录运行python就可以了。
在linux服务器上安装mysql-server,我安装的是mysql5.6
yum install -y mysql-community-server-5.6.34-2.el7.x86_64
centos7版本以前:service mysqld restart
centos7版本以后:systemctl restart mysql.service
mysql进行授权:
mysql
create database python;
grant all privileges on *.* 'wxp'@'%' identified by '1qazxsw@';
flush privileges;
解释:
mysql命令进入mysql数据库,create用来创建库名python,grant 进行授权,授权xiang用户对所有的服务器,所有的库,所有的表都有权限,密码123456。
连接数据库
import mysqldb #连接数据库 #host s数据库ip #port 数据库监听的端口 #user 数据库用户名 #passwd 数据库密码 #db 数据库名称 #charset 数据库字符编码,常用utf-8 #模块的化的思想,尽可能让代码模块化 def connect_mysql(): db_config = { "host": "192.168.1.5", "user": "wxp", "passwd": "1qazxsw@", "db": "python" "charset": "utf-8" } try: cnx = mysqldb.connect(**db_config) except exception as e: raise e return cnx
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对象给我们提供了两种办法来操作提交数据。
d) 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, 'lingjiang', 'm', '2015-04-01');
insert into employees(emp_no, emp_name, gender, hire_date) values(1002, 'xiang', 'm', '2015-04-01');
insert into employees(emp_no, emp_name, gender, hire_date) values(1003, 'shang', 'm', '2015-04-01');
mysql> select * from employees;
+--------+-----------+--------+------------+
| emp_no | emp_name | gender | hire_date |
+--------+-----------+--------+------------+
| 1001 | lingjiang | m | 2015-04-01 |
| 1002 | xiang | m | 2015-04-01 |
| 1003 | shang | m | 2015-04-01 |
+--------+-----------+--------+------------+
e) rows in set (0.00 sec)
上一篇: 聊聊MySQL事务的特性和隔离级别
下一篇: python 如何快速复制序列