Python DB-API
Python 为数据库编程提供了一个标准的数据库接口Python DB-API,如果没有这个标准库,Python针对不同数据库类型(Oracle,MySQL以及SQLServer)的编程会非常混乱,而且数据库切换代价较大。Python DB-API操作流程:
- 导入API模块, eg:import mysql.connector,MySQLdb,pymysql
- 连接数据库,eg:MySQLdb.connect(**config)
- 执行SQL语句
- 关闭数据库连接
采用Python DB-API的数据库编程如果要切换数据库,只需要适配修改导入API和连接数据库两步。
MySQL示例
import mysql.connector,MySQLdb,pymysql
class connection(object):
def __init__(self,*args):
self.config={'host':'xxx','port':123,'user':'xxx','passwd':'xxx','db':'xxx','charset':'utf8'}
#采用mysql.connector创建Connection对象
self.conn=mysql.connector.connect(**self.config)
#采用MySQLdb模块儿创建Connection对象
#self.conn=MySQLdb.connect(**self.config)
#采用pymysql模块儿创建Connection对象
#self.conn=pymysql.connect(**self.config)
#创建cursor对象
self.cursor=self.conn.cursor()
def __enter__(self):
return self
def __exit__(self,*exc_info):
self.conn.close()
self.cursor.close()
with connection() as conntest:
conntest.cursor.execute('select * from users')
data=conntest.cursor.fetchall()
print data
导入模块——创建Connection——获取cursor——执行sql&处理数据——关闭cursor——关闭Connection——结束
一、Connection对象
导入API模块后,connect()函数通过Connection对象访问数据库,该函数创建并返回一个Connection对象,connect()函数参数:
参数 | 类型 | 描述 |
user | string | 用户名 |
passwd | string | 密码 |
host | string | 主机名 |
port | int | 端口号 |
db | string | 数据库名称 |
charset | string | 编码方式 eg:‘utf8' |
Connection对象方法:
- cursor():使用该链接创建(并返回)一个游标或类游标的对象
- commit():提交当前事务
- rollback():回滚当前事务
- close():关闭连接
需要注意的是:在示例代码中有三种接口模块儿可以创建Mysql的Connection对象
- mysql.connector是一个python模块儿,比较慢,但是不需要C库,相对而言更便携,同时它的密码字段password和passwd均可
- MySQLdb是一个C模块儿,它使用MySQL客户端库中的MySQL协议实现连接,相对更快,但是需要C库,并且只支持到python2.4~2.7,密码字段:passwd
- pymysql是python3版本之后用来取代MySQLdb的模块儿,密码字段:passwd
二、Cursor对象(用于执行sql和获取结果)
- execute():执行数据库命令 客户端execute——mysql服务器执行sql——结果返回到客户端本地缓冲区
- fetchone():取结果集的下一行,Cursor是游标对象,所以这里是下一行,不是第一行
- fetchmany():取结果集的下几行
- fetchall():取结果集所有行
- rowcount:最近一次execute操作影响的函数
- close():关闭游标对象
数据库更新操作代码示例
注:插入和删除等操作修改相应的sql命令即可。
import mysql.connector,MySQLdb,pymysql
config={'host':'xxx','port':111,'user':'xxx','passwd':'xxx','db':'xxx','charset':'utf8'}
conn=mysql.connector.connect(**config)
#默认为false,设置自动提交为true,之后就不需要每次操作都commit
# conn.autocommit=True
cursor=conn.cursor()
sql1="""update users set id=23453452 where name='12'"""
sql2="""select * from users"""
try:
cursor.execute(sql1)
cursor.execute(sql2)
#如果不设置自动提交,这里需要commit保证操作执行,否则数据库不会更新(读者可以自己试试)
conn.commit()
print cursor.fetchall()
except:
#异常,将事务回滚
conn.rollback()
finally:
#最终,关闭数据库连接
cursor.close()
conn.close()
如果数据库不支持事务处理,或者启动了自动提交,commit方法无法使用;但有些数据库引擎如innadb,是一个事务型数据库引擎,不设置自动提交的情况下如果不使用commit,数据库操作是不会执行的。在Python数据库编程中,commit()方法执行游标所有的更新操作,rollback()方法回滚当前游标的所有操作。
关于事务机制:事务机制可以确保数据一致性。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
- 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
- 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
- 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。