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规范.

最新文章

  1. SQL 基本知识
  2. vim linux SecureCRT vim颜色的设置
  3. python 正则使用笔记
  4. android sqlite操作(2)
  5. OpenRisc-52-run openrisc&orpmon on ml501 board
  6. flash图标插件
  7. android——获取ImageView上面显示的图片bitmap对象
  8. Cummins INSITE locked and ask for verification code
  9. Arduino M0 的一个坑(2015-12-25)
  10. python 正则表达式汇总
  11. JavaScript(一基本语法)
  12. Array对象方法属性总结
  13. mysql的导入和导出
  14. AngularJS进入使用前的准备工作
  15. 模拟jquery底层链式编程
  16. Linux shell 脚本报错:/bin/bash^M: bad interpreter: No such file or directory
  17. udp_connect函数
  18. 【Android】Android WebView 网页输入框获取焦点
  19. supervisor 管理 celery
  20. [转]oracle存储过程中update不成功的一个原因

热门文章

  1. Docker 入门 --- 命令总结
  2. signal.h中的宏定义SIG_DFL及SIG_IGN
  3. JQUERY根据值将input控件选中!
  4. gdb基本命令(非常详细)
  5. DLL接口的实现(虚函数)
  6. Tomcat配置JMX远程监控(Windown7 Linxu)
  7. c++------------提取文件中的信息
  8. mac上怎么安装dmg
  9. Eclipse下进行SVN提交时报“svn: 过期”错误的解决办法
  10. 解决在IE浏览器中JQuery.resize()执行多次的方法(转)