学习连接地址:点击打开
Python DB API包含:
数据库连接对象:connection
数据库交互对象:cursor
数据库异常类:exceptions
开发数据库程序流程:
1.创建connection对象,获取cursor
2.使用cursor执行SQL
3.使用cursor获取数据、判断执行状态
4.提交事务 或者 回滚事务
使用Python DB AP访问数据库流程:
开始------->创建数据库连接connection------>获取cursor------>处理数据(增删查改)------->关闭cursor------>关闭connection------>结束
创建方法:MySQLdb.connect(参数)
参数名 类型 说明host 字符串 MySQL服务器地址port 数字 MySQL服务器端口号 user 字符串 用户名 passwd 字符串 密码 db 字符串 数据库名称 charset 字符串 连接编码
Connection对象支持的方法:
方法名 说明cursor() 使用该连接创建并返回游标 commit() 提交当前事务 rollback() 回滚当前事务 close() 关闭丽连接
创建数据库连接例子import MySQLdb conn = MySQLdb.connect( host='127.0.0.1', port=3306, user='root', passwd='mysql1991', db='testpy', charset='utf8' ) cursor = conn.cursor() print conn print cursor cursor.close() conn.close()3.数据库游标对象cursor
游标对象:用于执行查询和获取结果cursor支持的方法 参数名 说明fetch*()方法:移动rownumber,返回数据execute(op[,args]) 执行一个数据库查询和命令,将结果从数据库获取到客服端 fetchone 取的结果集的下一行 fetchmany(size) 获得结果集下几行 fetchall() 获取结果集中剩下的所有行 rowcount 最近一次execute返回数据的行数或影响行数,获取缓冲区中数据所有行数 close() 关闭游标对象select语句获取数据库数据# -*-coding:utf-8-*- import MySQLdb conn=MySQLdb.Connect(host='127.0.0.1',port=3306,user='root',passwd='mysql1991',db='testpy',charset='utf8') cursor = conn.cursor() #sql查询语句 sql='select * from user ' #sql语句执行 cursor.execute(sql) #获取返回数据总条数 rs=cursor.rowcount print rs #获取返回的第一条数据,此时游标rownumber=0,获取后=1 rs=cursor.fetchone() print rs #获取返回数据的接下来3条数据,此时游标rownumber=1,获取后=4 rs=cursor.fetchmany(3) print rs #获取剩下的所有返回数据,此时游标rownumber=4,获取后=最后条 rs=cursor.fetchall() print rs #循环获取,对每条数据进行处理 for row in rs: print 'userID=%s username=%s'% row cursor.close() conn.close()
事务的概念 事务:访问和更新数据库的一个程序执行单元 -原子性:事务中包括的诸操作要么都做,要么都不做 -一致性:事务必须是数据库从一致性状态变到另一个一致性状态 -隔离性:一个事务的执行不能被其他事务干扰 -永久性:事务一旦提交。它对数据库的改变就是永久性的
开发中的使用事务 -关闭自动commit:设置conn.autocommit(False) -正常结束事务:conn.commit() -异常结束事务:conn.rollback()增删改中事务的使用# -*-coding:utf-8-*- import MySQLdb conn = MySQLdb.Connect(host='127.0.0.1', port=3306, user='root', passwd='mysql1991', db='testpy', charset='utf8') cursor = conn.cursor() # 增删改 sql_insert = "insert into user(id,username) VALUE (10,'name10')" sql_update = "update user set username='name91' where id=9" sql_dalete = "delete from user where id<3" try:#如果没有出现异常,则提交事务 cursor.execute(sql_insert) print cursor.rowcount # 1 cursor.execute(sql_update) print cursor.rowcount # 1 cursor.execute(sql_dalete) print cursor.rowcount # 2 conn.commit() except Exception as e:#如果出现异常,则打印异常并且回滚事务 print e conn.rollback() cursor.close() conn.close()
例子,银行转账操作模拟:# coding:utf8 # sys.argv:如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。 import sys import MySQLdb class TransferMoney(object): def __init__(self, conn): self.conn = conn def transfer(self, source_account, target_account, money): try: self.check_account_available(source_account) # 检查source_account来源账户是否可用的方法 self.check_account_available(target_account) # 检查target_account目标账户是否可用的方法 self.have_enough_money(source_account, money) # 检查source_account来源账户是否有足够的钱 self.reduce_money(source_account, money) # source_account来源账户减去money self.add_money(target_account, money) # target_account目标账户增加相应的钱money self.conn.commit() # 如果都上面所以的操作都没有异常,则提交事务执行 except Exception as e: self.conn.rollback() raise e # 检查账户是否可用 def check_account_available(self, account): cursor = self.conn.cursor() try: sql = "select * from account where id=%s" % account cursor.execute(sql) print 'check_account_available' + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception('账号 %s 不存在:' % account) finally: cursor.close() # 检查账户余额是否充足 def have_enough_money(self, account, money): cursor = self.conn.cursor() try: sql = "select * from account where id=%s and money>=%s" % (account, money) cursor.execute(sql) print 'have_enough_money' + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception('账号 %s 没有足够的钱:' % account) finally: cursor.close() # 转出账户减去钱 def reduce_money(self, account, money): cursor = self.conn.cursor() try: sql = "update account set money=money-%s where id=%s" % (money, account) cursor.execute(sql) print 'reduce_money' + sql rs = cursor.rowcount if rs != 1: raise Exception('账号 %s 减款失败:' % account) finally: cursor.close() # 收款账户增加钱 def add_money(self, account, money): cursor = self.conn.cursor() try: sql = "update account set money=money+%s where id=%s" % (money, account) cursor.execute(sql) print 'add_money' + sql rs = cursor.rowcount if rs != 1: raise Exception('账号 %s 加款失败:' % account) finally: cursor.close() if __name__ == '__main__': # 只有当本模块之间运行的时候才执行,__name__才等于__main__ # sys.argvh从程序外部获取参数的桥梁 source_account = sys.argv[1] # 来源账户 target_account = sys.argv[2] # 目标账户 money_account = sys.argv[3] # 转账金额 # 数据库连接 conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='mysql1991', db='testpy', charset='utf8') # 转账类TransferMoney tr_money = TransferMoney(conn) try: tr_money.transfer(source_account, target_account, money_account) # transfer:转账类TransferMoney中的方法 except Exception as e: print '出现问题:' + str(e) finally: conn.close()