您的位置:首页 > 编程语言 > Python开发

Python数据库操作、Python DB API、数据库连接对象connection、数据库游标对象cursor

2017-06-21 23:43 691 查看
学习连接地址:点击打开

1.Python DB API

Python DB API包含:数据库连接对象:connection数据库交互对象:cursor数据库异常类:exceptions开发数据库程序流程:1.创建connection对象,获取cursor2.使用cursor执行SQL3.使用cursor获取数据、判断执行状态4.提交事务 或者 回滚事务使用Python DB AP访问数据库流程:开始------->创建数据库连接connection------>获取cursor------>处理数据(增删查改)------->关闭cursor------>关闭connection------>结束

2.数据库连接对象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支持的方法
参数名                  说明
execute(op[,args])      执行一个数据库查询和命令,将结果从数据库获取到客服端
fetchone                取的结果集的下一行
fetchmany(size)         获得结果集下几行
fetchall()              获取结果集中剩下的所有行
rowcount                最近一次execute返回数据的行数或影响行数,获取缓冲区中数据所有行数
close()                 关闭游标对象
fetch*()方法:移动rownumber,返回数据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 MySQLdbconn = 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  # 1cursor.execute(sql_update)print cursor.rowcount  # 1cursor.execute(sql_dalete)print cursor.rowcount  # 2conn.commit()except Exception as e:#如果出现异常,则打印异常并且回滚事务print econn.rollback()cursor.close()conn.close()
例子,银行转账操作模拟:
# coding:utf8# sys.argv:如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。import sysimport MySQLdbclass TransferMoney(object):def __init__(self, conn):self.conn = conndef 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_4000account, money)  # 检查source_account来源账户是否有足够的钱self.reduce_money(source_account, money)  # source_account来源账户减去moneyself.add_money(target_account, money)  # target_account目标账户增加相应的钱moneyself.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" % accountcursor.execute(sql)print 'check_account_available' + sqlrs = 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' + sqlrs = 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' + sqlrs = cursor.rowcountif 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' + sqlrs = cursor.rowcountif 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')# 转账类TransferMoneytr_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()

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息