基于Python实现一个简单的银行转账操作
前言 在进行一个应用系统的开发过程中,从上到下一般需要四个构件:客户端-业务逻辑层-数据访问层-数据库,其中数据访问层是一个底层、核心的技术。而且在实际开发中,数据库的操作也就是说数据访问层都是嵌套在其他语言中的,其是编程的核心。本文面向的是python语言,即通过python操作数据库来实现简单的银行转账操作。 工具 python提供了python DB API用来统一操作数据库,使访问数据库的接口规范化,在没有python DB API之前,接口程序十分混乱,不同的数据库需要不同的操作接口,所以这个接口提供了极大的方便。在具体操作的时候,我们需要操作数据库以及其他逻辑的python代码,数据库连接对象connection来建立连接,数据库交互对象cursor来“运送”数据,一个健壮的系统必不可少的便是数据库异常类Exceptions。整个访问数据库流程如下图: 接下来分别介绍下两个主要对象: connection:数据库连接对象,建立python客户端与数据库的网络连接。 原子性:事物中包括的诸操作要么都做,要么都不做 具体实现 在开发中我们怎么样使用事务呢? 关闭自动commit() 整个代码的逻辑如下:首先连接数据库,之后执行逻辑,然后断开数据库连接,执行的逻辑包括检查转账双方的账户是否有效,转账金额是否多于转账人的账户余额,分别给转账双方的帐号金额发生变化。如果正常结束事务,提交修改数据库,否则回滚。 #coding:utf-8 import sys import MySQLdb class TransferMoney(): def __init__(self,conn): self.conn = conn def transfer(self,src,target,money): try: self.check_acct_available(src) self.check_acct_available(target) self.has_enough_money(src,money) self.reduce_money(src,money) self.add_money(target,money) self.conn.commit() except Exception as e: print e self.conn.rollback() def reduce_money(self,money): cursor = self.conn.cursor() try: sql = "update account set money = money - %s where acctid = %s" %(money,src) cursor.execute(sql) print "reduce_money: " + sql #rs = cursor.fetchall() if cursor.rowcount != 1: raise Exception("the account reduce money fail") finally: cursor.close() def add_money(self,money): cursor = self.conn.cursor() try: sql = "update account set money = money + %s where acctid = %s" %(money,target) cursor.execute(sql) print "add_money: " + sql #rs = cursor.fetchall() if cursor.rowcount != 1: raise Exception("the account add money fail") finally: cursor.close() def check_acct_available(self,accit): cursor = self.conn.cursor() try: sql = "select * from account where acctid = %s" %accit cursor.execute(sql) print "check_acct_available: " + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception("the account %s is not exist" %accit) finally: cursor.close() def has_enough_money(self,money): cursor = self.conn.cursor() try: sql = "select * from account where acctid = %s and money >= %s " %(src,money) cursor.execute(sql) print "has_enough_money: " + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception("the account does not have enough money") finally: cursor.close() if __name__ == "__main__": source_acctid = sys.argv[1] target_acctid = sys.argv[2] money = sys.argv[3] conn = MySQLdb.connect( host = "127.0.0.1",user = '******',passwd = '******',port = 3306,db = '******' ) tr_money = TransferMoney(conn) try: tr_money.transfer(source_acctid,money) except Exception as e: print e finally: conn.close() 总结 通过对数据库的操作就可以实现一个简单的银行转账系统,所以在系统开发的时候,我们应该尽最大的可能,让整个系统不只是多个组件的拼接,应该实现1+1>2。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |