1、基本介绍:

python标准数据库接口为python DB-API,它为开发人员提供了数据库应用编程接口,可以支持mysql、Oracle、MSSQL、Sybase等多种数据库,不同的数据库需要下载不同的DB-API模块。
DBI-API是一个规范,它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。
python DB-API的使用流程是:
①引入API模块;②获取与数据库的连接;③执行SQL语句;④关闭数据库连接。
 
2、什么是MySQLdb?
MySQLdb-python是用于Python链接Mysql数据库的接口程序,python通过它实现对mysql数据库的各种操作。
使用之前必须保证MySQLdb已经在本地机上安装(当然,mysql程序也是必须要安装的)。
直接在网站上下载完MySQLdb-python安装包,安装完成即可。
通过检查MySQLdb模块是否正常导入来判断MySQLdb-python程序是否安装成功。
 
没有报错就代表安装成功。注意python是区分大小写的。
 
3、连接数据库:
 
说明:通过connect函数连接数据库,里面需要提供主机地址、端口、用户名、密码、数据库名称等信息。
上报错的原因是本地机上mysql服务没有开启。这时需要在命令行中通过net start mysql命令启动mysql服务。
这时候通过上面的conn1对象,已经连接到数据库上,但是要操作数据库,还需要创建游标。
通过数据库连接对象的cursor方法来创建游标。
 #导入MySQLdb模块
import MySQLdb #建立与数据库的连接
conn1=MySQLdb.connect(host='localhost' #主机名
,port=3306 #端口
,user='root' #用户名
,passwd='admin' #密码
,db='test123' #数据库名
)
#也可以简写成conn1=MySQLdb.connect('localhost','root','admin','test123') #创建游标
cur1=conn1.cursor() #对游标对象使用execute方法就可以执行普通的SQL语句
#做一次查询
cur1.execute('select * from table_a limit 5') #通过fetchall方法获取全部查询结果
result1=cur1.fetchall()
print result1 #通过fetchone方法获取一条查询结果
result2=cur1.fetchone()
print result2 #关闭游标
cur1.close() #断开数据库连接
conn1.close()

执行结果:

说明:打印的result1结果应当是五条记录,可以看出,通过fetchall()方法接收的查询结果被保存为元组,而元组的每一个元素代表一条记录,各个字段之间也组成了一个元组。

为什么打印的result2结果为None,这是因为,通过fetchall()方法进行结果获取时,游标已移到结果集末尾,这时候通过fetchone()方法获取记录时自然是空值。

在进行完数据库操作后,应当通过close方法关闭游标、断开数据库连接。
上面的例子简单的介绍了导入模块、建立连接、创建游标、执行SQL、显示查询结果集、断开连接等一些基本的通过python对mysql进行操作的方法和步骤。
下面将具体进行介绍。
 
4、创建表:
 #导入MySQLdb模块
import MySQLdb #建立与数据库的连接
conn2=MySQLdb.connect('localhost','root','admin','test123') #创建游标
cur2=conn2.cursor() #创建表table_d,如果已经存在,则先删除
cur2.execute('drop table if exists table_d') #编写创建表的SQL语句
#当字符串很长,并且需要跨多行时,可以使用三个单引号/双引号括起来
sql1="""create table table_d(std_id int not null
,std_name char(20)
,age int
,sex char(1)
)""" #创建表
cur2.execute(sql1) #查看是否创建成功
cur2.execute('show tables')
result1=cur2.fetchall()
print result1 #提交数据库执行
conn2.commit() #关闭游标
cur2.close() #断开数据库连接
conn2.close()

 执行结果:

说明:其中需要注意一点,通过游标对象的execute函数执行SQL时,有两种方式,一种是直接将SQL语句作为参数,另一种则是先创建一个字符串变量,其值为SQL语句,将该变量作为execute函数的参数。

 
5、查询操作:
fetchall()用于接收全部的查询结果集,返回一个元组,元组内一条元素代表一条记录,一个元素本身又是一个元组。
fetchone()用于接收一条结果记录。
rowcount()返回这次execute()操作影响的行数。
举例:下面要就那些这样一个查询操作:
 
在mysql里面的查询结果是:
 
下面在python里进行实现:
 #导入MySQLdb模块
import MySQLdb #建立与数据库的连接
conn3=MySQLdb.connect('localhost','root','admin','test123') #创建游标
cur3=conn3.cursor() #创建表
cur3.execute('select * from table_a where user_id=988917 and month_id=201503') #接收一条查询结果
result1=cur3.fetchone()
print result1 #接收全部查询结果
result2=cur3.fetchall()
print result2 #返回这次execute操作影响的记录数
print cur3.rowcount #循环遍历结果集记录
for row in result2:
user_id=row[0]
month_id=row[1]
brand_id=row[2]
rate=row[3]
print 'user_id=%d,month_id=%d,brand_id=%s,rate=%f' % \
(user_id,month_id,brand_id,rate) #关闭游标
cur3.close() #断开数据库连接
conn3.close()

 执行结果:

说明:这个查询的结果集应该是4条记录,由于首先使用了fetchone方法,因此,获取一条记录后游标移动到下一条记录的开头,所以再使用fetchall方法时就只能获取剩下的全部三条记录。

注意,不论是fetchone方法还是fetchall方法,最后返回的都是元组。
还有另外两种方法,fetchmany()和scroll(),前者可以指定获取多少条查询结果,后者可以用来移动游标。
 #导入MySQLdb模块
import MySQLdb #建立与数据库的连接
conn6=MySQLdb.connect('localhost','root','admin','test123') #创建游标
cur6=conn6.cursor() #创建表
cur6.execute('select * from table_a where user_id=988917 and month_id=201503') #返回这次execute操作影响的记录数
print cur6.rowcount #接收全部查询结果
result1=cur6.fetchall()
print result1 #再次接收全部查询结果
result2=cur6.fetchall()
print result2 #游标移动到结果集开始位置
cur6.scroll(0,'absolute') #绝对移动 #取出一条记录
result3=cur6.fetchone()
print result3 #游标向后移动一条记录
cur6.scroll(1,'relative') #相当移动,也是缺省移动方式,可以缩写为cur6.scroll(1) #取出两条记录
result4=cur6.fetchmany(2)
print result4 #关闭游标
cur6.close() #断开数据库连接
conn6.close()

执行结果:

说明:查询出4条记录,第一次使用fetchall()取出了全部记录,游标也相应的从结果集开始位置移动到结果集末尾,所以第二次使用fetchall()取出的就是空值,使用scroll()方法将游标移动到文件开始位置(位置0处,第一条查询结果记录编号为0,第二条编号为1,以此类推),再使用fetchone()就可以获取一条记录,这时候游标就移动到位置1处。再使用scroll()方法向后移动一个位置,游标到位置2处,这时候再使用fetchmany()方法取出2条记录。

注意scroll方法有两个参数,scroll(value,mode),mode缺省值为'relative',代表相对移动。当mode='relative'时,value就是移动的长度,value>0向后移动(从位置0移动到位置2),value<0向前移动(比如从位置2移动到位置0),当mode='absolute'时,代表绝对移动,value就代表移动的绝对位置,value=0就代表移动到位置0处,就是结果集开头,value=3就是移动到位置3处,也就是第4条记录处。
 
6、插入操作:
 #导入MySQLdb模块
import MySQLdb #建立与数据库的连接
conn4=MySQLdb.connect('localhost','root','admin','test123') #创建游标
cur4=conn4.cursor() #创建表table_e,如果已经存在,则先删除
cur4.execute('drop table if exists table_e') #创建表table_e
sql1="""create table table_e(user_id int not null
,month_id int
,brand_id varchar(20)
,rate float
)"""
cur4.execute(sql1) #插入一条数据
cur4.execute("insert into table_e values(999999,201505,'202B303',0.6752)") #验证是否插入成功
cur4.execute('select * from table_e')
result1=cur4.fetchall()
print result1 #再次插入一条记录[使用%s占位]
sql2="insert into table_e values(%s,%s,%s,%s)"
cur4.execute(sql2,(888888,201505,'303B202',0.6565)) #验证是否插入成功
cur4.execute('select * from table_e')
result2=cur4.fetchall()
print result2 #批量插入多条数据[每一个values作为一个元组,values共同组成一个列表,作为executemany的参数]
cur4.executemany(sql2,[
(666666,201505,'101B101',0.5000)
,(666666,201505,'202B202',0.7656)
,(666666,201505,'303B303',0.8965)
]
) #验证是否插入成功
cur4.execute('select * from table_e')
result3=cur4.fetchall()
print result3 #提交到数据库执行
conn4.commit() #关闭游标
cur4.close() #断开数据库连接
conn4.close()

执行结果:

说明:插入单条数据有两种写法,但都使用的是execute方法,而插入批量数据使用的是executemany方法。

一定要使用数据库连接对象的commit方法来提交插入,否则不能真正的插入数据。
 
7、更新操作: 
 #导入MySQLdb模块
import MySQLdb #建立与数据库的连接
conn5=MySQLdb.connect('localhost','root','admin','test123') #创建游标
cur5=conn5.cursor() #更新前
sql1="select * from table_e where user_id=888888"
cur5.execute(sql1)
result1=cur5.fetchall()
print result1 #update语句
sql2="update table_e set rate=0.9988 where user_id=888888"
try:
cur5.execute(sql2)
print cur5.rowcount
conn5.commit() #向数据库中提交
except:
conn5.rollback() #发生错误时回滚 #验证是否更新成功
sql3="select * from table_e where user_id=888888"
cur5.execute(sql3)
result2=cur5.fetchall()
print result2 #关闭游标
cur5.close() #断开数据库连接
conn5.close()

执行结果:

说明:一定要使用数据库连接对象的commit方法来提交更新,否则不能真正的更新数据。

 
8、删除操作:
delete操作和drop操作类似于上面例子中形式,最后都是需要commit方法进行提交更改。最后关闭游标、断开数据库连接。
 
9、commit()与rollback()方法:
在关系型数据库中通过事务机制来确保数据一致性。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。(ACID特性)
①原子性:atomicity,一个事物是一个不可分割的工作单位,事务内的操作要么都做要么都不做。
②一致性:consistency,事务必须是使数据库从一个一致性状态编导另一个一致性状态。
③隔离性:isolation,一个事务的执行不能被其他事务干扰,即一个事物内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
④持久性:durability,一个事务一旦提交,它对数据库中数据的改变就是永久性的。接下来的其他操作或者故障不应该对其有任何影响。
Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。
对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
commit()方法:提交游标的所有更新操作。
rollback()方法:回滚当前游标的所有操作。
 
 
参考资料:
感谢。
 
 
 

初见Python<7>:Python操作mysql的更多相关文章

  1. python学习之操作mysql

    欢迎点击个人博客 http://www.iwangzheng.com/ 刚开始学python,所以很多代码都需要在ipython里尝试一下.今天记录的是最基本的操作mysql数据库. 写数据库连接操作 ...

  2. 【Python】python读取文件操作mysql

    尾大不掉,前阵子做检索测试时,总是因为需要业务端操作db和一些其他服务,这就使得检索测试对环境和数据依赖性特别高,极大提高了测试成本. Mock服务和mysql可以很好的解决这个问题,所以那阵子做了两 ...

  3. python大法好——操作mysql

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

  4. python开发_python操作mysql数据库

    如果你还没有准备好开发环境,你不妨花上一小点时间去看看:python开发_mysqldb安装 本篇blog是有关python操作mysql数据的相关内容. 我做了一个demo: 先看运行效果: mys ...

  5. Python使用DB-API操作MySQL数据库

    Python提供了一个标准数据库API,称为DB-API,用于处理基于SQL的数据库.与任何底层数据库的交互都可以使用DB-API,因为DB-API在代码与驱动程序之间提供了一个抽象层,可以根据需要替 ...

  6. Python学习之==>操作MySQL

    一.简介: MySQL为关系型数据库,其他关系型数据库包括Oracle.DB2.Sql Server等等.Python操作MySQL需要使用到pymsyql模块,pip安装即可. 二.操作MySQL步 ...

  7. 【python】-- pymsql 操作MySQL

    pymysql 对MySQL数据库进行简单数据操作python模块主要是:MySQLdb.pymsql,MySQLdb模块主要用于python2.X,而python3.X则使用pymsql,pymys ...

  8. 【python】-- SQLAlchemy操作MySQL

    ORM.SQLAchemy orm英文全称object relational mapping,就是对象映射关系程序,简单来说就是类似python这种面向对象的程序来说一切皆对象,但是使用的数据库却都是 ...

  9. python 2.7 操作mysql数据库 实例

    create table msg(id int primary key auto_increment,title varchar(20),name varchar(60),content varcha ...

  10. python web.py操作mysql数据库,实现对数据库的增删改查操作

    使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...

随机推荐

  1. bzoj 1197 DP

    我们可以将这个问题转化为在n维空间中一共放m个n维球,求这m个球最多将这个空间分为不同的几个部分. 那么我们设w[i][j]代表i为空间放j个球分为的部分,那么w[i][j]=w[i][j-1]+w[ ...

  2. 模型验证与模型集成(Ensemble)

    作者:吴晓军 原文:https://zhuanlan.zhihu.com/p/27424282 模型验证(Validation) 在Test Data的标签未知的情况下,我们需要自己构造测试数据来验证 ...

  3. Win10默认图片查看器更改

    Win10自带的图片查看器不是很习惯,其背景乌漆嘛黑,宽扁的额头让人想起了黑边火腿肠手机,无法直视.怀念Win7和Win8.1的图片查看器,一个鼠标滚轮缩放自如的酸爽感觉.但却遗憾地发现,并不能直观地 ...

  4. 2015多校第6场 HDU 5358 First One 枚举,双指针

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5358 题意:如题. 解法:观察式子发现,由于log函数的存在,使得这个函数的值域<=34,然后我 ...

  5. 构造函数、原型对象prototype、实例、隐式原型__proto__的理解

    (欢迎一起探讨,如果有什么地方写的不准确或是不正确也欢迎大家指出来~) PS: 内容中的__proto__可能会被markdown语法导致显示为proto. 建议将构造函数中的方法都定义到构造函数的原 ...

  6. [ Python ] 基本数据类型及属性(上篇)

    1. 基本数据类型 (1) 数字 - int        (2) 字符串 - str        (3) 布尔值 - bool 2. int 类型中重要的方法 (1) int      将字符串转 ...

  7. CF868F Yet Another Minimization Problem

    题目描述: 给定一个序列,要把它分成k个子序列.每个子序列的费用是其中相同元素的对数.求所有子序列的费用之和的最小值. 输入格式:第一行输入n(序列长度)和k(需分子序列段数).下一行有n个数,序列的 ...

  8. StringBuilder类的作用,以及与String类的相互转换

    # 转载请留言联系 先看一段String类的字符串拼接的代码. String s = "hello" 会在常量池开辟一个内存空间来存储”hello". s += &quo ...

  9. 【python】多个文件共用日志系统的重复打印问题

    先写一个最简单的log文件: test_logging5.py #coding:utf-8 import logging logging.debug('logger debug message') l ...

  10. linux命令(18):chmod命令

    1. 命令格式: chmod [-cfvR] [--help] [--version] mode file 2. 命令功能: 用于改变文件或目录的访问权限,用它控制文件或目录的访问权限. 3. 命令参 ...