day20——安装客户端、数据库连接、mysql事务、mysql操作数据

python的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. 关闭数据库连接。

安装所需要的包

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 *.* ‘wxp‘@‘%‘ identified by ‘123456‘;

flush privileges;

解释:

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

连接数据库

 1 import MySQLdb
 2 #连接数据库
 3 #host s数据库ip
 4 #port 数据库监听的端口
 5 #user 数据库用户名
 6 #passwd 数据库密码
 7 #db 数据库名称
 8 #charset 数据库字符编码,常用utf-8
 9 #模块的化的思想,尽可能让代码模块化
10
11 def connect_mysql():
12     db_config = {
13         "host": "192.168.1.5",
14         "user": "wxp",
15         "passwd": "[email protected]",
16         "db": "python"
17         "charset": "utf-8"
18     }
19     try:
20         cnx = MySQLdb.connect(**db_config)
21     except Exception as e:
22         raise e
23     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)

游标操作

我们先来看一个例子:

接下来,我们通过python代码增加一条数据到数据库中,代码如下:

 1 import MySQLdb
 2
 3 def connect_mysql():
 4
 5     db_config = {
 6
 7         ‘host‘: ‘192.168.48.128‘,
 8
 9         ‘port‘: 3306,
10
11         ‘user‘: ‘xiang‘,
12
13         ‘passwd‘: ‘123456‘,
14
15         ‘db‘: ‘python‘,
16
17         ‘charset‘: ‘utf8‘
18
19     }
20
21     cnx = MySQLdb.connect(**db_config)
22
23     return cnx
24
25 if __name__ == ‘__main__‘:
26
27     cnx = connect_mysql()
28
29     cus = cnx.cursor()
30
31     sql  = ‘‘‘ create table test(id int not null);insert into test(id) values (100);‘‘‘
32
33     try:
34
35         cus.execute(sql)
36
37 cus.close()
38
39         cnx.commit()
40
41     except Exception as e:
42
43         cnx.rollback()
44
45         print(‘Error‘)
46
47         # raise e
48
49     finally:
50
51         cnx.close()

结果:

Error

查看数据库中的数据:select * from employees;并没有发生变化

解释:

在我们插入数据雇佣时间字段:hire_date的时候,故意把时间写错,导致异常发生,捕获到异常之后,打印Error,最后关闭mysql连接。cus = cnx.cursor()是创建一个游标对象,具体我们在后面进行介绍。

1,  创建游标对象

 1 Import MySQLdb
 2
 3  db_config = {
 4
 5         ‘host‘: ‘192.168.48.128‘,
 6
 7         ‘port‘: 3306,
 8
 9         ‘user‘: ‘wxp‘,
10
11         ‘passwd‘: ‘123456‘,
12
13         ‘db‘: ‘python‘,
14
15         ‘charset‘: ‘utf8‘
16
17     }
18
19 cnx = MySQLdb.connect(**db_config)
20
21 cus = cnx.cursor()

这样就是创建一个游标对象,以后我们对mysql的各种操作都是基于游标进行操作,后面我们将详细介绍。

在了解该方法之前,我们先来了解什么叫做游标,

游标(cursor)

  游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果

  用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由python进一步处理,一组主变量一次只能存放一条记录

  仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求

  1.游标和游标的优点

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。

常用方法:

cursor():创建游标对象
       close():关闭此游标对象
       fetchone():得到结果集的下一行
       fetchmany([size = cursor.arraysize]):得到结果集的下几行
       fetchall():得到结果集中剩下的所有行
       excute(sql[, args]):执行一个数据库查询或命令
       executemany (sql, args):执行多个数据库查询或命令

下面我们来看一个例子:

 1 import MySQLdb
 2
 3 def connect_mysql():
 4
 5     db_config = {
 6
 7         ‘host‘: ‘192.168.48.128‘,
 8
 9         ‘port‘: 3306,
10
11         ‘user‘: ‘xiang‘,
12
13         ‘passwd‘: ‘123456‘,
14
15         ‘db‘: ‘python‘,
16
17         ‘charset‘: ‘utf8‘
18
19     }
20
21     cnx = MySQLdb.connect(**db_config)
22
23     return cnx
24
25 if __name__ == ‘__main__‘:
26
27     cnx = connect_mysql()
28
29     cus = cnx.cursor()
30
31     sql  = ‘‘‘select * from employees;‘‘‘
32
33     try:
34
35         cus.execute(sql)
36
37         result1 = cus.fetchone()
38
39         print(‘result1:‘)
40
41         print(result1)
42
43         result2 = cus.fetchmany(1)
44
45         print(‘result2:‘)
46
47         print(result2)
48
49         result3 = cus.fetchall()
50
51         print(‘result3:‘)
52
53         print(result3)        cus.close()
54
55         cnx.commit()
56
57     except Exception as e:
58
59         cnx.rollback()
60
61         print(‘error‘)
62
63         raise e
64
65     finally:
66
67         cnx.close()

结果:

result1:

(1001L, u‘lingjiang‘, u‘M‘, datetime.date(2015, 4, 1))

result2:

((1002L, u‘xiang‘, u‘M‘, datetime.date(2015, 4, 1)),)

result3:

((1003L, u‘shang‘, u‘M‘, datetime.date(2015, 4, 1)),)

解释:

1,  先通过MySQLdb.connect(**db_config)建立mysql连接对象

2,  在通过 = cnx.cursor()创建游标

3,  fetchone():在最终搜索的数据中去一条数据

4,  fetchmany(1)在接下来的数据中在去1行的数据,这个数字可以自定义,定义多少就是在结果集中取多少条数据。

5,  fetchall()是在所有的结果中搞出来所有的数据。

对于excute()和excutemany()的方法,我们会在以一节详细分析他们的区别。

执行多条语句的sql时要注意:

 1 from demon2 import connect_mysql
 2
 3 import MySQLdb
 4
 5 def connect_mysql():
 6
 7     db_config = {
 8
 9         "host": "192.168.48.128",
10
11         "port": 3306,
12
13         "user": "xiang",
14
15         "passwd": "123456",
16
17         "db": "python",
18
19         "charset": "utf8"
20
21     }
22
23     try:
24
25         cnx = MySQLdb.connect(**db_config)
26
27     except Exception as e:
28
29         raise e
30
31     return cnx
32
33 if __name__ == "__main__":
34
35     sql = "select * from tmp;"
36
37     sql1 = "insert into tmp(id) value (%s);"
38
39     param = []
40
41     for i in xrange(100, 130):
42
43         param.append([str(i)])
44
45     print(param)
46
47     cnx = connect_mysql()
48
49     cus = cnx.cursor()
50
51     print(dir(cus))
52
53     try:
54
55         cus.execute(sql)
56
57         cus.executemany(sql1, param)
58
59         # help(cus.executemany)
60
61         result1 = cus.fetchone()
62
63         print("result1")
64
65         print(result1)
66
67         result2 = cus.fetchmany(3)
68
69         print("result2")
70
71         print(result2)
72
73         result3 = cus.fetchall()
74
75         print("result3")
76
77         print(result3)
78
79         cus.close()
80
81         cnx.commit()
82
83     except Exception as e:
84
85         cnx.rollback()
86
87         raise e
88
89     finally:
90
91         cnx.close()
时间: 2024-08-29 22:35:18

day20——安装客户端、数据库连接、mysql事务、mysql操作数据的相关文章

数据库-mysql事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

MySQL 事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

mysql系列详解四:mysql事务-技术流ken

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

【Mysql】Mysql的安装、部署与图形化

Mysql是一个必须学会如何安装与部署的工具,它不同于其它那些傻瓜式的应用/程序,一键到底,如果是初次在Windows下安装Mysql的初学者还是有一定难度的. 本文配合之前的<[Javaweb]前台开发环境的配置Myeclipse6.5+JDK1.6+Tomcat6.0+SVN1.8>(点击打开链接)一文中的前台开发环境的部署,也就形成了JavaWeb.JSP.J2EE的基本开发环境. 一.Mysql的下载 首先打开Mysql的官网(点击打开链接),百度一下是搜不到的,我也找了很久才找到My

MYSQL事务及存储引擎对比

Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性状态,这时有必要引入事务的概念. Mysql提供了多种引擎支持Innodb和BDB.Innodb存储引擎事务主要通过UNDO日志和REDO日志实现,Myisam和memory引擎则不支持事务.下图分别给出三种mysql引擎的区别和特性: Myisam存储引擎:由于该引擎不支持事务.也不支持外键,所以

python开发mysql:mysql安装(windows)&amp;密码找回&amp;存储引擎简介&amp;库表的增删改查

一,mysql安装 1 下载地址 https://dev.mysql.com/downloads/file/?id=471342 2 解压后,将目录C:\mysql-5.7.19-winx64\bin添加到计算机环境变量中 3 4 用CMD命令行执行,mysqld --initialize-insecure 初始化数据库,这样C:\mysql-5.7.19-winx64 5 这个目录下就会产生data的目录,里面包含的就是初始化的东西,配置文件,用户密码信息 6 -insecure 这个参数就是

14.Mysql事务控制和锁定

14.事务控制和锁定存储引擎和锁: MyISAM和MEMORY存储引擎的表支持表级锁: BDB存储引擎的表支持页级锁: InnoDB存储引擎的表支持行级锁.默认情况下,表锁和行锁都是根据执行的语句自动获得和释放,不需要额外处理.用户也可根据业务需要来手动添加和释放锁,以保证事务的完整性. 14.1 Lock table和Unlock tableLock table可以锁定用于当前线程的表.如果表被其他线程锁定,则当前线程会等待,直到可以获取所需的锁定为止.Unlock table可以释放当前线程

MySQL事务隔离级别详解

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的).

Mysql事务&字符集

Mysql事务 Innodb存储引擎的中的事务完全服务ACID: 原子性.2.一致性.3.隔离性.4.持久性 理解上和oracle类似. 事务隔离级别 1.Read uncommitted 读未提交: 2.Read committed 读已提交: 3.Repeatable read 可重复读,类似oracle利用undo的闪回查询: 4.Serializable 串行读,很少用. 隔离级别的修改: 通过set命令: 通过修改配置文件,启动数据库的默认隔离级别-mysqld Mysql字符集 My