Python 数据库编程

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()函数参数:

参数类型描述
userstring用户名
passwdstring密码
hoststring主机名
portint端口号
dbstring数据库名称
charsetstring编码方式 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),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值