1. 创建数据库并构造表 acctid用来标识账户 money用来标注账户的金额
可以查看一下表的结构 更加直观
2. 插入两个账户的数据并查看表中存储的内容 可以看到在1号户中存储了300,在2号中存储了1000
3. 接下来我们实现模拟银行转账系统的python源码
#模拟银行转账系统
import sys
import pymysql
class TransferMoney(object):
def __init__(self,conn):
self.conn=conn
#检查账户是否可用(通过检查账户唯一性实现)
def check_acct_available(self,acctid):
try:
cursor=self.conn.cursor()
sql="select * from accunt where acctid=%s"%acctid
cursor.execute(sql)
print("check_acct_available : "+sql)
rs=cursor.fetchall()
if len(rs)!=1:
raise Exception("账户 %s 不唯一"%acctid)
finally:
cursor.close()
#检查账户中是否有多于money参数的金额 作为reduce_money的前提条件使用
def has_enough_money(self,acctid,money):
try:
cursor=self.conn.cursor()
sql="select * from accunt where acctid=%s and money > %s"%(acctid,money)
cursor.execute(sql)
print("has_enough_money : "+sql)
rs=cursor.fetchall()
if len(rs)!=1:
raise Exception("账户 %s 金额不足"%acctid)
finally:
cursor.close()
#减少账户中money数量的金额
def reduce_money(self,acctid,money):
try:
cursor=self.conn.cursor()
sql="update accunt set money=money-%s where acctid=%s"%(money,acctid)
cursor.execute(sql)
print("reduce_money : "+sql)
if cursor.rowcount!=1:
raise Exception("减少账户 %s 金额失败"%acctid)
finally:
cursor.close()
#增加账户acctid money数量的金额
def add_money(self,acctid,money):
try:
cursor=self.conn.cursor()
sql="update accunt set money=money+%s where acctid=%s"%(money,acctid)
cursor.execute(sql)
print("add_money : "+sql)
if cursor.rowcount!=1: #影响的行数不唯一
raise Exception("增加账户 %s 金额失败"%acctid)
finally:
cursor.close()
#测试函数,用于测试该转账系统能否正常工作
def transfer(self,source_acctid,target_acctid,money):
try:
self.check_acct_available(source_acctid)
self.check_acct_available(target_acctid)
self.has_enough_money(source_acctid,money)
self.reduce_money(source_acctid,money)
self.add_money(target_acctid,money)
self.conn.commit()
except Exception as e:
self.conn.rollback()
if __name__=="__main__":
source_acctid=sys.argv[1] #源账户
target_acctid=sys.argv[2] #目标账户
money=sys.argv[3] #金额
conn=pymysql.Connect(host='127.0.0.1',user='root',passwd='12345',port=3306,db='bank')
tr_money=TransferMoney(conn)
try:
tr_money.transfer(source_acctid,target_acctid,money)
except Exception as e:
print("出现错误 : "+str(e))
finally:
conn.close()
4. 观察代码我们发现 transfer函数 先检查了两个账户是否可用 然后检查源账户是否有足够的金额 然后源账户减少money数量的金额 目标账户增加money数量的金额 最后提交事务 如果出现错误 那么将返回转账前的状态 两个账户金额没有改变
5. 运行该python程序 参数意为“由账户2向账户1转账500”
可以看到一切顺利执行
6. 我们打开MySQL数据库查看转账是否成功 我将转账前的数据一并切下来便于观察
这时我们发现由账户2向账户1转账500已经成功 至此大功告成!
------啥都没有 只有发发博客维持的了生活的样子