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

Python操作MySQL-(3)转账实例

2017-06-11 14:12 405 查看
通过一个实例演示Python操作mysql的全部用法。

实例:两个账户Tom和Jack,两个人可以互相转钱。

具体流程(假如Tom给Jack转钱):

开始事务----->检查账户是否可用----->检查Tom是否有足够的钱----->Tom账户减去相应的钱,Jack加上----->提交事务
其中每次发生异常都需要回滚事务。


首先实现框架流程:

#三部曲:连接数据库----->获取转账操作实例----->转账
if __name__=='__main__':

source_id = sys.argv[1]     #转账人的id
target_id = sys.argv[2]     #收款人的id
money = sys.argv[3]         #转账金额

#连接数据库
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='', port=3306,db='test')

#获取转账操作的实例
tr_money = TransferMoney(conn)

try:
#开始转账操作
tr_money.transfer(source_id, target_id, money)
except Exception as e:
print('error :' + str(e))
finally:
conn.close()


其次实现TransferMoney()

这里直接贴出代码:

class TransferMoney(object):
def __init__(self, conn):
self.conn = conn

def transfer(self, source_id, target_id, money):
try:
self.check_id_available(source_id)      #检查两者id是否存在
self.check_id_available(target_id)
self.has_enough_money(source_id, money) #检查转账人是否有足够的钱
self.reduce_money(source_id, money)     #减钱
self.add_money(target_id, money)        #收钱
self.conn.commit()                      #以上没有异常 提交事务
except Exception as e:
self.conn.rollback()                    #出错回滚事务
raise e                                 #异常重新抛出

#ID是否可用,也就是数据库是否有这个id
def check_id_available(self, id):
cur = conn.cursor()
try:
sql = "SELECT * FROM tb WHERE id=%s" % id
cur.execute(sql)
print('check_id_available:'+sql)
res = cur.fetchall()                #获取返回结果  (1,'Tom',1600)
if len(res) != 1:                   #获取到1个才对
raise Exception("账号%s不存在", id)
finally:
cur.close()

#是否有足够的钱
def has_enough_money(self, id, money):
cur = conn.cursor()
try:
sql = "SELECT * FROM tb WHERE id=%s AND money>%s" % (id,money)
cur.execute(sql)
print('has_enough_money:'+sql)
res = cur.fetchall()                    #获取返回结果  (1,'Tom',1600)
if len(res) != 1:
raise Exception("账号%s没有足够的钱", id)
finally:
cur.close()

#减少钱
def reduce_money(self, id, money):
cur = conn.cursor()
try:
sql = 'UPDATE tb SET money=money-%s WHERE id=%s' % (money, id)
cur.execute(sql)
print('reduce_money:' + sql)

#影响1行语句
if cur.rowcount != 1:           #更改了数据库,所以影响一行
raise Exception("账号%s减钱失败" % id)

finally:
cur.close()

#增加钱
def add_money(self, id, money):
cur = conn.cursor()
try:
sql = 'UPDATE tb SET money=money+%s WHERE id=%s' % (money, id)
cur.execute(sql)
print('add_money:' + sql)

# 影响1行语句
if cur.rowcount != 1:           #更改了数据库,所以影响一行

raise Exception("账号%s加钱失败" % id)

finally:
cur.close()


测试代码

import sys之后,给main函数传参数的方法是:

在Run–>Python–>项目名称–>Configuration–>Script parameters



我在这里传入id=1,2 每次转钱是450元。

在运行之前数据库的数据是



运行一次,且打印如下

check_id_available:SELECT * FROM tb WHERE id=1
check_id_available:SELECT * FROM tb WHERE id=2
has_enough_money:SELECT * FROM tb WHERE id=1 AND money>450
reduce_money:UPDATE tb SET money=money-450 WHERE id=1
add_money:UPDATE tb SET money=money+450 WHERE id=2




由于每次减少450所以,再次运行三次(第三次就会报错了,因为Tom的钱不够了)

下图是运行两次



然后运行第三次

check_id_available:SELECT * FROM tb WHERE id=1
check_id_available:SELECT * FROM tb WHERE id=2
has_enough_money:SELECT * FROM tb WHERE id=1 AND money>450
error :账号1没有足够的钱


实例测试完毕!(^__^) ……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息