python 3.6.5 模拟银行转账系统

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已经成功 至此大功告成!


                                                                                                    ------啥都没有 只有发发博客维持的了生活的样子



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值