设为首页 收藏本站
查看: 1155|回复: 0

[经验分享] 26. Python 对 mysql 的操作

[复制链接]

尚未签到

发表于 2018-8-10 11:30:00 | 显示全部楼层 |阅读模式
  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中执行:
DSC0000.png

  如果结果如上图所示,就说明你安装成功了,如果有如下报错信息,
  >>> 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() 的作用是创建一个游标对象。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549619-1-1.html 上篇帖子: python小白之paramiko(1) 下篇帖子: Python学习之列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表