From: http://www.yiibai.com/python/python_mysql.html

Python标准的数据库接口的Python DB-API(包括Python操作MySQL)。大多数Python数据库接口坚持这个标准。
 
 

Python标准的数据库接口的Python DB-API。大多数Python数据库接口坚持这个标准。.

你可以选择适合您应用的数据库。Python数据库API支持范围广泛的数据库服务器:

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase

下面是可用的Python数据库接口的列表:

Python Database Interfaces and APIs 

你必须下载一个单独的DB API的模块,你需要访问的每个数据库。例如,如果你需要访问Oracle数据库以及MySQL数据库,你必须下载Oracle和MySQL数据库模块.

DB API提供了与数据库的工作,尽可能使用Python的结构和语法的最低标准。这个API包括以下:

  • 导入API模块.

  • 获取与数据库的连接.

  • 发出SQL语句和存储过程.

  • 关闭连接

我们这里将仅学习使用MySQL的所有概念,所以让我们来谈谈MySQLdb模块.

什么是MySQLdb?

MySQLdb的是一个接口连接到MySQL数据库服务器从Python。它实现了Python数据库API V2.0,并建上的MySQL C API的顶端.

我怎么安装MySQLdb?

在进行之前,您确认您已经MySQLdb的机器上安装。只是在你的Python脚本键入以下命令并执行它:

#!/usr/bin/python

import MySQLdb

如果它产生以下结果,那么它意味着未安装MySQLdb模块:

Traceback (most recent call last):
File "test.py", line 3, inimport MySQLdb
ImportError: No module named MySQLdb

安装MySQLdb模块,MySQLdb的下载页面下载并进行如下,

window平台可以到http://www.codegood.com/archives/4下载:

$ gunzip MySQL-python-1.2.2.tar.gz
$ tar -xvf MySQL-python-1.2.2.tar
$ cd MySQL-python-1.2.2
$ python setup.py build
$ python setup.py install

注: 确保你有root权限来安装上述模块.

数据库连接:

连接到一个MySQL数据库之前确保以下:

  • 你已经创建了一个数据库TESTDB.

  • 你已经创建了一个EMPLOYEE表在TESTDB中.

  • EMPLOYEE表有以下几个字段: FIRST_NAME, LAST_NAME, AGE, SEX and INCOME.

  • “testuser的”用户ID和密码“test123”设置用来访问TESTDB。

  • Python模块MySQLdb在你的机器上正确安装.

  • 你已通过MySQL的教程,了解MySQL基础

例子:

以下是连接MySQL数据库“TESTDB”例子

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method
cursor = db.cursor() # execute SQL query using execute() method.
cursor.execute("SELECT VERSION()") # Fetch a single row using fetchone() method.
data = cursor.fetchone() print "Database version : %s " % data # disconnect from server
db.close()

而在我的Linux机器运行此脚本,其产生的结果如下.

Database version : 5.0.45

如果连接建立的数据源,然后返回一个Connection对象,并保存成数据库,为进一步利用,否则DB设置为None。下一步db对象是用来创建一个游标对象,而这又是用来执行SQL查询.

最后出来之前,它确保数据库连接被关闭,资源被释放.

创建数据库表:

一旦建立一个数据库连接,我们已经准备好创建表或记录到数据库中使用表创建的游标的执行方法.

例子:

首先,让我们创建数据库表Employee:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method
cursor = db.cursor() # Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )""" cursor.execute(sql) # disconnect from server
db.close()

插入操作:

INSERT操作时,需要你想创建一个数据库表记录.

例子:

以下是执行SQL INSERT语句创建一个记录到EMPLOYEE表的例子.

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method
cursor = db.cursor() # Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback() # disconnect from server
db.close()

上面的例子可以写成如下动态创建SQL查询:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method
cursor = db.cursor() # Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback() # disconnect from server
db.close()

例子:

下面的代码段是另一种形式执行,在那里你可以直接传递参数:

..................................
user_id = "test123"
password = "password" con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................

读取操作:

任何databasse读取运作手段从数据库中获取一些有用的信息.

我们的数据库建立连接后,我们准备进入这个数据库查询。我们可以使用fetchone()方法来获取单个记录或者fetchAll方法fetech从数据库表的多个值.

  • fetchone(): 这种方法获取查询结果集的下一行。结果集是一个对象时,将返回一个游标对象用于查询表.

  • fetchall(): 这种方法获取结果集的所有行。如果某些行已经从结果集中提取,fetchAll()方法检索结果集的其余行.

  • rowcount: 这是一个只读属性,返回受影响的行数execute()方法.

例子:

以下是程序查询雇员年薪超过1000表的所有记录.

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method
cursor = db.cursor() # Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# Now print fetched result
print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fecth data" # disconnect from server
db.close()

这将产生以下结果:

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

更新操作:

对任何数据库更新操作意味着更新已经可以在数据库中的一个或多个记录。以下是更新所有的记录为“M”SEX的过程。在这里,我们将所有男性年龄增加一年.

例子:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method
cursor = db.cursor() # Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback() # disconnect from server
db.close()

删除操作:

DELETE操作是必需的,当你想从数据库中删除一些记录。以下是程序删除雇员的所有记录,其中年龄超过20岁.

例子:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method
cursor = db.cursor() # Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback() # disconnect from server
db.close()

执行事务:

事务是机制,以确保数据的一致性,事务应该有以下四个属性:

  • 原子性: 无论是事务结束或什么也没有发生在所有.

  • 一致性: 必须启动一个事务一致的状态和离开系统是一致的状态.

  • 隔离性: 在当前事务外,事务的中间结果是不可见的.

  • 持久性: 一旦事务提交,效果是持久的,即使系统发生故障后.

对Python DB API 2.0提供两种方法来提交或回滚事务.

例子:

你已经看到我们是如何实施事务。这是一次类似的例子:

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()

提交操作:

提交是操作给出了一个绿色的信号数据库来完成的变化,没有变化,此操作后可以恢复.

下面是一个简单的例子,调用commit方法.

    db.commit()

回滚操作:

如果您不满意与一个或更多的变化,你想恢复这些变化完全使用rollback方法.

下面是一个简单的例子,调用rollback方法.

   db.rollback()

断开数据库:

要断开数据库连接,使用close()方法.

db.close()

如果连接到一个数据库是由用户使用close()方法关闭,任何未完成的事务都将回滚数据库。然而,您的应用程序,而不是取决于任何DB的低层次的实现细节上,将更好地调用commit或显式使用rollback.

错误处理:

有许多错误的来源。举几个例子是在执行SQL语句的语法错误,连接失败,或已经取消或完成的语句句柄调用获取方法.

DB API定义了一些错误,必须存在于每个数据库模块。下表列出了这些异常.

Exception Description
Warning Used for non-fatal issues. Must subclass StandardError.
Error Base class for errors. Must subclass StandardError.
InterfaceError Used for errors in the database module, not the database itself. Must subclass Error.
DatabaseError Used for errors in the database. Must subclass Error.
DataError Subclass of DatabaseError that refers to errors in the data.
OperationalError Subclass of DatabaseError that refers to errors such as the loss of a connection to the database. These errors are generally outside of the control of the Python scripter.
IntegrityError Subclass of DatabaseError for situations that would damage the relational integrity, such as uniqueness constraints or foreign keys.
InternalError Subclass of DatabaseError that refers to errors internal to the database module, such as a cursor no longer being active.
ProgrammingError Subclass of DatabaseError that refers to errors such as a bad table name and other things that can safely be blamed on you.
NotSupportedError Subclass of DatabaseError that refers to trying to call unsupported functionality.

你的Python脚本应该处理这些错误,但在使用上述任何例外之前,确保您的MySQLdb的支持该异常。你可以得到更多关于他们的信息,通过阅读DB API 2.0规范.

Python MySQL(MySQLdb)的更多相关文章

  1. Python安装MySQLdb并连接MySQL数据库

    当然了,前提是你已经安装了Python和MySQL.我的Python是2.6版本的. Python2.6的“Set”有点兼容性问题,自己照着改一下: http://sourceforge.net/fo ...

  2. Ubuntu安装MySQL和Python库MySQLdb步骤

    一.安装MySQL服务器和客户端 执行以下命令: sudo apt-get install mysql-server-5.6 mysql-client-5.6 sudo apt-get install ...

  3. python之MySQL MySQLdb 推荐使用姿势,解决中文乱码

    0.目录 2.setup(1) 安装步骤,可以顺带安装mysql administrator和mysql query browser(2) 安装完毕,修改 my.ini(3) 重启 mysql 服务: ...

  4. Python之路-python(mysql介绍和安装、pymysql、ORM sqlachemy)

    本节内容 1.数据库介绍 2.mysql管理 3.mysql数据类型 4.常用mysql命令 创建数据库 外键 增删改查表 5.事务 6.索引 7.python 操作mysql 8.ORM sqlac ...

  5. Python—>Mysql—>Dbvisualizer

    MySQLdb: https://pypi.python.org/pypi/MySQL-python/1.2.4 import MySQLdb 1.Download Connector/Python: ...

  6. Python Mysql 篇

    Python 操作 Mysql 模块的安装 linux: yum install MySQL-python window: http://files.cnblogs.com/files/wupeiqi ...

  7. python mysql desc

    #!/usr/bin/python import MySQLdb try: conn=MySQLdb.connect(host='localhost',user='root',passwd='your ...

  8. Python MySQL ORM QuickORM hacking

    # coding: utf-8 # # Python MySQL ORM QuickORM hacking # 说明: # 以前仅仅是知道有ORM的存在,但是对ORM这个东西内部工作原理不是很清楚, ...

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

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

随机推荐

  1. Spark orderBy(desc("col"))部分数据排序失败

    起因 对数据进行三个维度的排序,用的是orderBy(desc("col")),结果其中两个维度上结果返回正确,另外一个维度上结果出现了大的排在后面的结果,错误的结果大概如下: w ...

  2. Android NDK之二:创建NativeActivity

    转:http://blog.csdn.net/xiruanliuwei/article/details/7560914 Android NDK为我们提供了两种方式来实现我们的native activi ...

  3. 【Professional English】Words Summary

    01.数据库管理系统(Database Management Systems,DBMS) A database management system (DBMS) is a computer softw ...

  4. Python3玩转单链表——逆转单向链表pythonic版

    [本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...

  5. C#学习笔记(9)——委托(窗体传值)

    说明(2017-5-30 11:38:06): 1. 窗体1传值到窗体2,只要实例化Form2,“Form2 frm2 = new Form2(txt1.Text)”,这里要给Form2加一个带参数的 ...

  6. python parse xml using DOM

    demo: import xml.dom.minidom dom=xml.dom.minidom.parse('sample.xml')root = dom.documentElementcc=dom ...

  7. Maven 本地打war包

    Maven是个很好用的管理工具,不经能够管理jar,还能实现打包. 这里讲解Maven 本地打包,服务器打包,可以全部交给jenkins去完成的. 用Maven打包,先在eclipse装Maven插件 ...

  8. [转]收藏的Extjs 多表头插件GroupHeaderGrid

    本文转载自chy2z<收藏的Extjs 多表头插件GroupHeaderGrid> 效果图: 是不是非常酷啊! js 代码: Ext.namespace("Ext.tet.plu ...

  9. connect设置超时的方法

    在使用TCP的connect连接服务器时,在默认情况下系统使用的是阻塞式socket,如果服务器当前不可用,则connect会等待知道超时时间到达,而这个超时时间是系统内核规定的,并不能使用setSo ...

  10. OpenWRT中的按键和灯的GPIO控制实现_转

    本文转自:OpenWRT中的按键和灯的GPIO控制实现 基于BarrierBreaker版本,基于AR9331 AP121 Demo单板 来进行描述 1.灯 A.在mach-ap121.c中,定义了灯 ...