NOTE(2017-11-18): MySQLdb 不支持 Python 3,而 Python 3 是主流,所以就没有学习的必要了。

环境:MySQL 5.6.27, Ubuntu 15.10 64-bit

官方简介

MySQLdb is an thread-compatible interface to the popular MySQL

database server that provides the Python database API.

安装

通过 pip 安装

$ apt-get install python-dev libmysqlclient-dev

$ pip install MySQL-python

通过 apt 安装

$ sudo apt-get install python-mysqldb

模块 _mysql

MySQLdb 安装好后,有两个模块或方式可用。模块 _mysql 提供的是类似于 MySQL C 接口的 API,而模块 MySQLdb 在 _mysql 基础上又做了进一步封装,使之符合 Python 的数据库 API 规范。推荐使用后者。

使用 _mysql 的例子:

import _mysql

import sys

try:

con = _mysql.connect('localhost', 'root', '******', 'test')

con.query('select version()')

result = con.use_result()

print 'MySQL version: %s' % result.fetch_row()[0]

except _mysql.Error, e:

print 'Error %d: %s' % (e.args[0], e.args[1])

sys.exit(1)

finally:

if con:

con.close()

改用 MySQLdb:

import MySQLdb as mdb

import sys

try:

con = mdb.connect('localhost', 'root', '******', 'test')

cur = con.cursor()

cur.execute('select version()')

ver = cur.fetchone()

print 'MySQL version: %s' % ver

except mdb.Error, e:

print 'Error %d: %s' % (e.args[0], e.args[1])

sys.exit(1)

finally:

if con:

con.close()

创建表,插入数据

# coding: utf-8

import MySQLdb as mdb

con = mdb.connect('localhost', 'root', '******', 'test')

with con:

cur = con.cursor()

cur.execute('drop table if exists writers')

cur.execute('create table writers(id int primary key auto_increment,\

name varchar(25)) default charset utf8')

cur.execute('insert into writers(name) values("Jack London")')

cur.execute('insert into writers(name) values("Honore de Balzac")')

cur.execute('insert into writers(name) values("Lion Feuchtwanger")')

cur.execute('insert into writers(name) values("Emile Zola")')

cur.execute('insert into writers(name) values("Truman Capote")')

cur.execute('insert into writers(name) values("曹雪芹")')

查询

一次取回所有结果:fetchall

import MySQLdb as mdb

con = mdb.connect('localhost', 'root', '******', 'test')

with con:

cur = con.cursor()

cur.execute('select * from writers')

# 结果集 rows 为元组(tuple)的元组,每一个元组代表了表中的一行。

rows = cur.fetchall()

for row in rows:

print row

挨个取回结果:fetchone

import MySQLdb as mdb

con = mdb.connect('localhost', 'root', '******', 'test')

with con:

cur = con.cursor()

cur.execute('select * from writers')

for i in range(cur.rowcount):

row = cur.fetchone()

print row

使用字典 Cursor

import MySQLdb as mdb

con = mdb.connect('localhost', 'root', '******', 'test')

def test_dict_cursor():

with con:

cur = con.cursor(mdb.cursors.DictCursor) # 字典 cursor

cur.execute('select * from writers limit 4')

# rows 为字典的元组

rows = cur.fetchall()

for row in rows:

print row['id'], row['name'] # 通过列名访问结果

打印列名

import MySQLdb as mdb

con = mdb.connect('localhost', 'root', '******', 'test')

with con:

cur = con.cursor()

cur.execute('select * from writers limit 4')

rows = cur.fetchall()

# 元组的元组,每一个元组对应一个结果列,元组的第一个元素为列名。

desc = cur.description

# 打印前两个结果列的列名。

print '%s %3s' % (desc[0][0], desc[1][0])

for row in rows:

print '%2s %3s' % row

Prepared Statements

Prepared Statements 可以提高安全性和性能,特别是对于多次重复执行的查询。Python 的数据库 API 规范建议了 5 种不同的方式来构造 Prepared Statements,MySQLdb 只支持其中的一种,代码类似于 ANSI printf 的格式化操作。

Prepared Statements 在 ORM 库(比如 SQLAlchemy)中应该会有更完善的支持。

注(2016-01-10):

这里的 Prepared Statements 只是客户端的模拟,跟 MySQL Server 的 Prepared Statements 是两码事,所以并不能提高性能或安全性。(详见 C API Prepared Statements)

import MySQLdb as mdb

con = mdb.connect('localhost', 'root', '******', 'test')

with con:

cur = con.cursor()

cur.execute("update writers set name = %s where id = %s",

("Guy de Maupasant", "4"))

print "Number of rows updated:", cur.rowcount

事务

前面的例子一直使用 with 语句来管理链接 (connection) 对象,避免了 commit 的直接调用。

一旦 cursor 创建,一个事务也就开始,结束时必须调用 commit 或 rollback。commit 提交修改,rollback 回滚。如果结合 with 语句使用的话,commit 和 rollback 都将自动完成,因为 MySQLdb 的链接对象可以当作 context manager 使用。

# coding: utf-8

import MySQLdb as mdb

try:

con = mdb.connect('localhost', 'root', '******', 'test')

# Cursor 创建,事务开始。

cur = con.cursor()

cur.execute('drop table if exists writers')

# MyISAM doesn't support transaction.

cur.execute('create table writers(id int primary key auto_increment,\

name varchar(25)) engine=innodb')

cur.execute('insert into writers(name) values("Jack London")')

cur.execute('insert into writers(name) values("Honore de Balzac")')

cur.execute('insert into writers(name) values("Lion Feuchtwanger")')

cur.execute('insert into writers(name) values("Emile Zola")')

cur.execute('insert into writers(name) values("Truman Capote")')

# 显式地调用 commit 来结束一个事务。

con.commit()

except mdb.Error, e:

# 异常发生时,调用 rollback 进行回滚。

if con:

con.rollback()

print "Error %d: %s" % (e.args[0], e.args[1])

sys.exit(1)

finally:

if con:

con.close()

Cursor 有必要 close 吗?

原则上讲,不需要显式地调用 cursor 对象的 close 方法,因为当 cursor 对象生命期结束时,close 方法会被自动调用。源码如下:

class BaseCursor(object):

def __del__(self):

self.close()

self.errorhandler = None

self._result = None

不过,还是建议主动调用 close,这样至少代码的行为更加明显。

python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库相关推荐

  1. mysqlclient==1.3.7对应mysql版本_Python通过MySQLdb访问操作MySQL数据库

    前言 Python支持通过多种方式访问MySQL数据库.可能有些刚入门的朋友们对Python访问MySQL数据库还不是很熟悉,故计划对Python访问MySQL数据库的这几种方式分别作一介绍. 系列第 ...

  2. python操作mysql(一)MySQLdb模块安装和数据库基本操作

    1.ubuntu环境下安装python-MySQLdb sudo apt-get install build-essential python-dev libmysqlclient-dev sudo ...

  3. python fetchall()转化为数据框_python 操作mysql数据中fetchone()和fetchall()方式

    fetchone() 返回单个的元组,也就是一条记录(row),如果没有结果 则返回 None fetchall() 返回多个元组,即返回多个记录(rows),如果没有结果 则返回 () 需要注明:在 ...

  4. python pymysql实例_Python使用pymysql模块操作mysql增删改查实例分析

    Python使用pymysql模块操作mysql增删改查实例分析 发布时间:2020-09-30 16:42:12 来源:脚本之家 阅读:92 本文实例讲述了Python使用pymysql模块操作My ...

  5. python对sqlite增删改查_Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】...

    本文实例讲述了python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的 ...

  6. mac上mysql关闭不了了_python操作mysql数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...

  7. mysql驱动_python3 接口测试数据驱动之操作mysql数据库

    python3 接口测试数据驱动之操作mysql数据库 1.1 操作mysql数据库 1.1.1 python3操作mysql介绍 操作数据库是程序员常用的技能之一,mysql数据库是中小型项目的首选 ...

  8. nodejs操作mysql创建库和表_Nodejs操作MySQL数据库

    如何用nodejs操作MySql数据呢,其实写法还是简单的, 1.开始在你的node项目中 npm install mysql --save 2.在你的新建项目中 引入代码 //引入数据库 var m ...

  9. mysql命令行cmd_CMD命令行操作MySQL

    连接MySQL服务器: mysql -u用户名 -p密码 mysql -u用户名 -p Enter Password:输入密码(无密码则直接回车) mysql -h主机名 -u用户名 -p密码 -D数 ...

  10. linux系统关于mysql的命令_[操作系统]Linux 操作MySql命令

    [操作系统]Linux 操作MySql命令 0 2016-11-08 10:00:42 1.安装MySql服务端命令: yum install mysql-server yum install mys ...

最新文章

  1. Windows DPM 备份数据
  2. iOS - 解决设置导航栏按钮图片变色的问题
  3. 数字滤波常用方法(转)
  4. 随想录(怎么阅读代码)
  5. ======第五章设备管理======
  6. 【转载】VBA 读取EXCEL 行列总数
  7. 基于Bmob从零开始写一个博客小程序
  8. android浮动标题栏,GitHub - DARTTTTT/LBehavior: 跟随手势滑动,显示隐藏标题栏、底部导航栏及悬浮按钮的Android Behavior Library...
  9. underscore 系列之字符实体与 _.escape
  10. matlab 韩明距离_科学网—Matlab中 pdist 函数详解(各种距离的生成) - 朱新宇的博文...
  11. 电力-104规约实际测试1
  12. 计算机视觉中的图像扭曲
  13. android 修改cpu信息,从Android源码修改cpu信息
  14. Ansys许可重新配置
  15. input文本框隐藏边框
  16. 1×pbs缓冲液配方_PBS缓冲液的配方
  17. 2021/3/30前端百度笔试题
  18. Android桥方法设置GPS信号,android-GPS更新间隔更快,信号良好?
  19. 论文写作:MATLAB+Visio生成不失真的PDF图像,同时解决MATLAB图像plot绘制有白边的问题
  20. 实现“附近的人”的方式原理

热门文章

  1. MVC3+Entity Framework 实现投票系统(一)
  2. 部署nginx反向代理及缓存
  3. 使用Uploadify实现上传图片生成缩略图例子,实时显示进度条
  4. android camera分辨率设置,请问如何使用camera2设置全屏preview,要求适配所有屏幕尺寸?...
  5. Mock和Java单元测试中的Mock框架Mockito介绍
  6. 写代码的16个好习惯,减少80%的bug
  7. Python应用02--批量往Mysql数据库插入数据
  8. 让mysql返回的结果按照传入的id的顺序排序
  9. Python中的支持向量机SVM的使用(有实例项目给的地址)
  10. php使用mkdir创建多级目录入门例子