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 '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)
游标操作
我们先来看一个例子:
接下来,我们通过python代码增加一条数据到数据库中,代码如下:
import MySQLdb
def connect_mysql():
db_config = {
'host': '192.168.1.5',
'port': 3306,
'user': 'wxp',
'passwd': '1qazxsw@',
'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, 创建游标对象
Import MySQLdb
db_config = {
'host': '192.168.1.5',
'port': 3306,
'user': 'wxp',
'passwd': '1qazxsw@',
'db': 'python',
'charset': 'utf8'
}
cnx = MySQLdb.connect(**db_config)
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):执行多个数据库查询或命令
下面我们来看一个例子:
import MySQLdb
def connect_mysql():
db_config = {
'host': '192.168.1.5',
'port': 3306,
'user': 'wxp',
'passwd': '1qazxsw@',
'db': 'python',
'charset': 'utf8'
}
cnx = MySQLdb.connect(**db_config)
return cnx
if __name__ == '__main__':
cnx = connect_mysql()
cus = cnx.cursor()
sql = '''select * from
employees;'''
try:
cus.execute(sql)
result1 = cus.fetchone()
print('result1:')
print(result1)
result2 = cus.fetchmany(1)
print('result2:')
print(result2)
result3 = cus.fetchall()
print('result3:')
print(result3) cus.close()
cnx.commit()
except Exception as e:
cnx.rollback()
print('error')
raise e
finally:
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时要注意:
from demon2 import connect_mysql
import MySQLdb
def connect_mysql():
db_config = {
"host": "192.168..51",
"port": 3306,
"user": "xiang",
"passwd": "1qazxsw@",
"db": "python",
"charset": "utf8"
}
try:
cnx = MySQLdb.connect(**db_config)
except Exception as e:
raise e
return cnx
if __name__ == "__main__":
sql = "select * from tmp;"
sql1 = "insert into tmp(id) value (%s);"
param = []
for i in xrange(100, 130):
param.append([str(i)])
print(param)
cnx = connect_mysql()
cus = cnx.cursor()
print(dir(cus))
try:
cus.execute(sql)
cus.executemany(sql1, param)
# help(cus.executemany)
result1 = cus.fetchone()
print("result1")
print(result1)
result2 = cus.fetchmany(3)
print("result2")
print(result2)
result3 = cus.fetchall()
print("result3")
print(result3)
cus.close()
cnx.commit()
except Exception as e:
cnx.rollback()
raise e
finally:
cnx.close()
day21-python操作mysql1的更多相关文章
-
python操作mysql——mysql.connector
连接mysql, 需要mysql connector, conntector是一种驱动程序,python连接mysql的驱动程序,mysql官方给出的名称为connector/python, 可参考m ...
-
Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy
本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...
-
Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
-
练习:python 操作Mysql 实现登录验证 用户权限管理
python 操作Mysql 实现登录验证 用户权限管理
-
Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
-
Python操作Mysql之基本操作
pymysql python操作mysql依赖pymysql这个模块 下载安装 pip3 install pymysql 操作mysql python操作mysql的时候,是通过”游标”来进行操作的. ...
-
Python操作RabbitMQ
RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从“生产者”接收消息并传递消 ...
-
python操作日期和时间的方法
不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...
-
Python—操作redis
Python操作redis 连接方式:点击 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建, ...
-
python成长之路【第十三篇】:Python操作MySQL之pymysql
对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎 ...
随机推荐
-
go:defer
defer:延迟. 假设有调用函数A.被调用函数B,其关系如下: func A(){//调用函数 ... defer B()//被调用函数 ... return//B将延迟到return前执行 } * ...
-
git命令之git tag 给当前分支打标签
git tag - 标签相关操作 发表于 2011年06月29日 由 机器猫 标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签$ ...
-
Spring Data JPA 查询方法支持的关键字
Table 2.3. Supported keywords inside method names Keyword Sample JPQL snippet And findByLastnameAndF ...
-
利用 cos 组件实现jsp中上传附件
需求:在web功能中附件上传功能为最基本的功能之一,所以用cos组件做了一个附件上传的demo.附件上传功能的实现可以利用其它的java组件实现,相关资料网上比较多. 说明步骤:下载组件并安装 --& ...
-
javascript正则——贪婪匹配
熟悉正则的朋友都知道,正则的匹配有“贪婪”和“非贪婪”之分. “贪婪”匹配是尽可能多的匹配: 对于字符串‘aaaa’, /a+/匹配整个字符串,而非贪婪匹配/a+?/匹配的是整个字符串的第一个‘a’, ...
-
每天一个小算法(Shell Sort3)
希尔算法自己编了一个,循环很多,很不美观,不过运行正确: c语言实现: #include <stdio.h> #include <stdlib.h> #define LEN 2 ...
-
zoj3229 Shoot the Bullet(有源汇有上下界的最大流)
题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...
-
Java IO教程 导读
Java IO是一套java 用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并有输入产生一些输出.Java为此提供了java.io包. 如果你浏览下java.io包,会对其中各样的类 ...
-
Django 上下文处理器
Django 上下文处理器 模板要在上下文中渲染. 上下文是django.template.Context的实例.django.template.RequestContext是Django提供的一个子 ...
-
OpenWrt/LEDE配置OpenVPN Server
安装openvpn不再赘述 准备证书文件主要有以下文件: (服务端)ca.crtdh2048.pemserver.crtserver.key(客户端)ca.crtclient01.keydp-clie ...