• 20171120_Python学习六周一次课(11月20日)


    12.1 安装客户端
    12.2 数据库连接
    12.3 mysql事务
    12.4 mysql操作数据

    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

    /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 *.* 'xiang'@'%' identified by '123456';

    flush privileges;

    解释:

    Mysql命令进入mysql数据库,create用来创建库名python,grant 进行授权,授权xiang用户对所有的服务器,所有的库,所有的表都有权限,密码123456。

    2. 数据库连接

    MySQLdb提供了connect方法用来和数据库建立连接,接收数个参数,返回连接对象:

    代码如下:

    首先在mysql的数据库中建立python库:create database python;

    conn=MySQLdb.connect(host="192.168.48.128",user="xiang",passwd="123456",db="python",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 事务主要用于处理操作量大,复杂度高的数据。比如,你操作一个数据库,公司的一个员工离职了,你要在数据库中删除他的资料,也要删除该人员相关的,比如邮箱,个人资产等。这些数据库操作语言就构成了一个事务。

    在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, '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)

  • 相关阅读:
    大话设计模式学习笔记简单工厂 工厂 抽象工厂
    910月总序(update 1)
    虚表思考再探虚表布局
    深入浅出 (代码+图示)递归反转一个栈 lp 专题讲解
    算法导论笔记 二叉查找树问题
    叹 尽然把vs2008 crash!!
    关于二叉查找树的讨论+ 我的误解
    算法情景分析 二叉排序树 前驱+后缀 测试用列
    iBatis.NET中使用时间的注意事项
    JDK和JRE官方下载地址
  • 原文地址:https://www.cnblogs.com/zhuntidaoren/p/7867742.html
Copyright © 2020-2023  润新知