MySQLdb

  MySQLdb是一款较为底层的,python连接mysql用的模块。和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式主要还是进行SQL语句的执行。

■  安装

  在Linux下

pip install MySQL-python

  如果安装之后仍不能正常运行,尝试用yum install MySQL-python,因为这个模块需要一些第三方程序来运行的。

  如果是在windows环境下安装的话那么可以直接下载一个安装程序来安装已经编译好的模块。比如去【http://www.codegood.com/downloads】下载。

■  基本使用

  MySQLdb提供了connect方法来建立一个与数据库的连接,调用这个对象的close方法来关闭一个连接。通过这个连接可以创建出一个游标对象,通过游标对象来进行数据的增删查改。

import MySQLdb

db = MySQLdb.connect(host='localhost',user='weiyz',passwd='',db='test_DB',charset='utf-8')

cursor = db.cursor()    #创建一个游标对象
cursor.excute("use test_table;show tables;") #执行SQL语句,注意这里不返回结果,只是执行而已 res = cursor.fetchall() #fetchall方法返回所有匹配的元组,给出一个大元组(每个元素还是一个元组) ####或者也可以这样####
res = cursor.fetchone()
while res:
print res
res = cursor.fetchone() #fetchone只给出一条数据,然后游标后移。游标移动过最后一行数据后再fetch就得到None db.close()

  另外关于db这个连接对象,除了可以实例化一个游标对象之外,还可以进行commit(),rollback()等操作。

■  游标对象的执行和返回数据

  就像上面例子中提到的那样,cursor可以调用execute来执行一定的SQL语句,也可以fetchone或者fetchall来得到返回的数据。接下来详细看一下cursor的各个方法:

  callproc(procname[,args])  调用一个叫做procname的存储过程

  close()  游标也有关闭方法,游标被关闭之后就不能再移动,更不能被fetch

  execute(query[,args])  query是一个SQL串,args是一个序列或者映射,将依次为query中的变量赋值。关于query串中的变量设置下面会细讲。这个方法返回的值是影响的行数(比如查询SQL就返回查询到了多少行,增删SQL就返回增删了多少行)

  executemany(query[,args])  这个方法和execute是类似的,只不过它是重复好几次执行execute,args也是一个“相同长度序列的序列”,每一次执行都把一个序列中的项对应到query的变量中去。据说executemany在效率上比execute高出很多, 在批量插入、批量更新时可以考虑使用。需要注意的是,这个方法是一个整体,如果想要进行多次查询操作用这个方法的话往往只能得到最后一个参数约束到SQL中得到的结果集。

  fetchone/fetchall()  获得一行/所有行结果

  fetchmany([size])  size指出了我到底要获取多少行的数据,如果能够返回的行数小于要求的行数的话,就以少的为准。

  nextset()  放弃所有结果集中结果直接跳到下个结果集(如果有的话)。如果没有更多结果集就返回None,否则返回True,接下来的fetch操作将会从新结果集返回数据了。所谓结果集,就是比如连着执行两条SQL语句的话,如果不调用nextset,那么fetch来fetch去总是只能得到第一个语句的结果内容,调用了这个之后就可以看到下一个语句执行结果的内容了。

  rowcount  这个属性代表了上一次execute*方法得到结果的结果行数,如果是-1则代表了上一次返回结果没有结果集且行数无法确定。

  ●  query字符串中的变量设置

  query中可以设置变量来动态地生成一些SQL语句,从而使得操作更加灵活多变。query中的变量大多数时候用在查询操作里面,因为没有统一的格式规定,设定变量的方法有很多种形式。比如可以用?,格式化字符串,数字等等。下面统一用格式化字符串的形式来表示。

  比如"select Sno,Sname from Student where Sno=%s"

  “select * from Client where level > %d and gid = %s"

  这些变量可以和execute*方法的args参数进行配合以具体化。对于execute方法而言,因为只执行一次SQL,所有它的args只需要一个元组(序列),元组各元素和SQL串中的变量一一对应。而对于executemany方法,args是一系列上面那样的元组组成的一个元组(序列),相当于以一个循环依次把大元组中的各个小元组约束进SQL执行。实例:

SQL = """
select * from Client where level > %d and gid = %s
"""
cursor.execute(SQL,(2,'')) #需要注意的是,如果只有一个变量,args不要写类似('10001')这样,因为这判是<type 'str'>而不是tuple,应该写('10001',) print cursor.fetchone() ##如果同样的SQL,用executemany来查询多个结果集的话
cursor.executemany(SQL,(\
(2,''),\
(2,''),\
(1,''),\
)\
)
#如此就相当于依次把2,10001;2,10002和1,10003约束给SQL在执行,但是从查询数据的角度来看,只能得到10003的数据,
#因为executemany是一口气执行完的,fetch只能fetch到最后一个数字。所以executemany比较适合用于写而不是读操作。

■  事务操作

  因为MySQLdb是比较底层的模块,对数据库的操作都基于最基本的SQL语句,所以也就无所谓细讲如何增删查改了(反正到头来都是调用SQL),不过对于事务,还是有必要提及。

  事务是通过接口对于数据库做出操作的最基本操作单位,可以看成是一系列操作的集合。一个事务具有以下特性:

  原子性,事务中的所有操作要么都做要么都不做。

  一致性,事务可以把数据库从一个一致性状态转变成另一个一致性状态

  永久性,事务对数据库做出的改变是永久的。

  隔离性,事务不应该被其他并行运行的事务所影响,事务间彼此应该是独立的

  基于以上对于事务的理解,可以如此利用事务的commit和rollback方法:

SQL = "DELETE FROM Client WHERE level < %d"

db = MySQLdb.connect(xxxxx)
cursor = db.cursor()
try:
cursor.execute(SQL,(2,))
db.commit()
except Exception,e:
db.rollback()
finally:
cursor.close()
db.close()

  对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。

■  积累

  ●  关于使用MySQLdb获取到的数据的类型不符合预期的问题

  今天碰到了一个问题。从数据库中通过MySQLdb获取到了一些数据是诸如这样的((u'01',8L,Decimal(900.00)),)。可以看到MySQLdb取数据的时候对于相应的MySQL中的数据类型会被转换成类似的Python中的类型。但是有时候我们不想要那么repr地表示,比如这一行数据我就只想让它是'01',8,900.0这些比较基本的Python中的类型而不是unicode,long,float这些。

  一种办法是在取得数据之后进行一些数据的清洗。找到的另一种办法是将建立连接时的convertor改变。

  MySQLdb在建立和MySQL之间的连接的时候,会声明好数据库数据类型和Python数据类型的对应关系。这部分信息被维护在了MySQLdb.convertors.conversions这个字典里。重点关注这个字典的中间部分有一些类似于FIELD_TYPE.XXX: xxx的键值对。键值其实是一个常量,后者是Python中的一个类型。这个字典就是会在MySQLdb.connect方法被执行时作为一个参数传递进来,并凭借里面的信息来对应类型的。

  所以如果我们想把默认从数据库中取出来的Decimal换成float,8L换成int的8,就可以这么高:

from MySQLdb import convertors

conv = convertors.conversions.copy()
conv[246] = float # 246对应FIELD_TYPE.NEWDECIMAL,在convertors.py的代码中,如果from decimal import Decimal没有出错那么这个类型的数据最终返回Decimal,现在改成了float
conv[3] = int
conv[4] = int
# 3和4分别对应Long和LongLong数据,都改成int了 conn = MySQLdb.connect(host='xxxx',user='xxx',passwd='xxx',db='xxx',charset='xxx',conv=conv)
# 将参数conv设置为我们修改过的字典,之后再进行常规操作即可

【Python】 MySQLdb的安装与使用的更多相关文章

  1. Python MySQLdb Mac安装遇到的问题

    Mac 下使用Python 连接Mysql 数据库,使用到模块MySQLdb,各种问题都出现,搜集整理下,最后发现最关键的还是Mac 下的Python 版本问题 前置条件: 1. 已经安装mysql ...

  2. Python MySQLdb在Linux下的快速安装

    在家里windows环境下搞了一次 见   python MySQLdb在windows环境下的快速安装.问题解决方式 http://blog.csdn.NET/wklken/article/deta ...

  3. Python的MySQLdb模块安装,连接,操作,增删改

    1. 首先确认python的版本为2.3.4以上,如果不是需要升级python的版本     python -V   检查python版本 2. 安装mysql, 比如安装在/usr/local/my ...

  4. cygwin 下安装python MySQLdb

    cygwin 下安装python MySQLdb 1) cygwin 更新 运行 cygwin/setup-x86_64.exe a 输入mysql,选择下面的包安装: libmysqlclient- ...

  5. python之mysqldb模块安装

    之所以会写下这篇日志,是因为安装的过程有点虐心.目前这篇文章是针对windows操作系统上的mysqldb的安装.安装python的mysqldb模块,首先当然是找一些官方的网站去下载:https:/ ...

  6. python MySQLdb在windows环境下的快速安装

    python MySQLdb在windows环境下的快速安装.问题解决方式 使用python访问mysql,需要一系列安装 linux下MySQLdb安装见 Python MySQLdb在Linux下 ...

  7. windows 环境下安装python MySQLdb

    使用Python访问MySQL,需要一系列安装 Linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://blog.csdn.NET/wklken/arti ...

  8. 117、python MySQLdb在windows环境下的快速安装、问题解决方式

    使用Python访问MySQL,需要一系列安装 Linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://blog.csdn.NET/wklken/arti ...

  9. python MySQLdb Windows下安装教程及问题解决方法(python2.7)

    使用python访问mysql,需要一系列安装 linux下MySQLdb安装见  Python MySQLdb在Linux下的快速安装http://www.jb51.net/article/6574 ...

  10. macOS安装Python MySQLdb

    macOS安装Python MySQLdb 0. 参考 Mac OS X - EnvironmentError: mysql_config not found 1. 背景 import MySQLdb ...

随机推荐

  1. 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 背景:Memcached攻击创造DDoS攻击流量纪录 近日,利用Memcached服务器实施反射DDoS攻击的事件呈大幅上 ...

  2. 对于vxworks下硬盘驱动

    1.曾经看到帖子说vxworks5.5下没有sata驱动,vxworks6.6下有,这样的说法恐怕不正确,由 于俺在5.5下也运用运用了sata硬盘,请注重这里俺只是说运用运用,没有说运用运用了sat ...

  3. Windows PE入门基础知识:Windows PE的作用、命名规则、启动方式、启动原理

    Windows PE的全名是WindowsPreinstallationEnvironment(WinPE)直接从字面上翻译就 是"Windows预安装环境".微软的本意是:Win ...

  4. offline页面开发常用方法及页面控件验证

    offline页面开发常用方法及页面控件验证,对一些CheckBoxList操作进行封装,新人可以直接使用该代码. 1.返回上一页网址 /// <summary> /// Descript ...

  5. Unhandled event loop exception No more handles

    1.错误描述 2.错误原因 3.解决办法

  6. jquery获取选中的文本和值

    jquery获取选中的文本和值 1.说明 (1)获取select下拉框选中的索引       $("#selection").get(0).selectedIndex; (2)获取 ...

  7. jquery回调函数的一个案例

    1.引言 今天在学习<jQuery基础教程>在学习编写插件的时候,书中说利用回调函数来当参数,会极大的提高程序的灵活性.对回调函数很陌生.研究了一下给的示例程序.感觉对回调函数有了基本的了 ...

  8. Html行内元素和块级元素

    1.关于行内元素和块状元素的说明 根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display ...

  9. 利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程

    项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. ...

  10. SVN的安装以及和eclipse的结合使用

    SVN概述 l 通常软件开发由多人协作开发,如果对代码文件.配置文件.文档等没有进行版本控制,将会出现很多问题: l 备份多个版本,占用磁盘空间大 l 解决代码冲突困难 l 容易引发BUG l 难于追 ...