26. Python 对 mysql 的操作

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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中执行:

64ae193ccae5be8f8d75eb9631a50c73.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

有时候,为了代码规范,推荐把所有数据库的配置写在一个字典中,如下所示:

1
2
3
4
5
6
7
8
9
10
11
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%';

1
2
3
4
5
6
7
8
9
+ ----------------------------------+--------+
| Variable_name                    | Value  |
+ ----------------------------------+--------+
| auto_increment_increment         | 1      |
| auto_increment_offset            | 1      |
| autocommit                       |  ON      |
| automatic_sp_privileges          |  ON      |
+ ----------------------------------+--------+
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;

1
2
3
4
5
6
7
+ -----------+----------------+----------+----------------+
| 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代码增加一条数据到数据库中,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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() 的作用是创建一个游标对象。



本文转自 听丶飞鸟说 51CTO博客,原文链接:http://blog.51cto.com/286577399/1983631

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
25天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
114 1
|
1月前
|
数据格式 Python
如何使用Python的Pandas库进行数据透视图(melt/cast)操作?
Pandas的`melt()`和`pivot()`函数用于数据透视。基本步骤:导入pandas,创建DataFrame,然后使用这两个函数转换数据格式。示例代码展示了如何通过`melt()`转为长格式,再用`pivot()`恢复为宽格式。输入数据是包含&#39;Name&#39;和&#39;Age&#39;列的DataFrame,最终结果经过转换后呈现出不同的布局。
39 6
|
1月前
|
XML 关系型数据库 MySQL
python将word(doc或docx)的内容导入mysql数据库
用python先把doc文件转换成docx文件(这一步也可以不要后续会说明),然后读取docx的文件并另存为htm格式的文件(上一步可以直接把doc文件另存为htm),python根据bs4获取p标签里的内容,如果段落中有图片则保存图片。(图片在word文档中的位置可以很好的还原到生成的数据库内容) 我见网上有把docx压缩后解压获取图片的,然后根据在根据xml来读取图片的位置,我觉得比较繁琐。用docx模块读取段落的时候还需要是不是判断段落中有分页等,然而转成htm之后就不用判断那么多直接判断段落里的样式或者图片等就可以了。
22 1
|
21天前
|
存储 SQL 关系型数据库
【MySQL】4. 表的操作
【MySQL】4. 表的操作
21 0
|
16天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
20天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
4天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
4天前
|
索引 Python
如何使用Python的Pandas库进行数据透视表(pivot table)操作?
使用Pandas在Python中创建数据透视表的步骤包括:安装Pandas库,导入它,创建或读取数据(如DataFrame),使用`pd.pivot_table()`指定数据框、行索引、列索引和值,计算聚合函数(如平均分),并可打印或保存结果到文件。这允许对数据进行高效汇总和分析。
10 2
|
11天前
|
数据采集 JSON 网络协议
「Python系列」Python urllib库(操作网页URL对网页的内容进行抓取处理)
`urllib` 是 Python 的一个标准库,用于打开和读取 URLs。它提供了一组模块,允许你以编程方式从网络获取数据,如网页内容、文件等。
34 0
|
22天前
|
Python
python使用tkinter库,封装操作excel为GUI程序
python使用tkinter库,封装操作excel为GUI程序