基于Python实现一个简单的银行转账操作

前言

在进行一个应用系统的开发过程中,从上到下一般需要四个构件:客户端-业务逻辑层-数据访问层-数据库,其中数据访问层是一个底层、核心的技术。而且在实际开发中,数据库的操作也就是说数据访问层都是嵌套在其他语言中的,其是编程的核心。本文面向的是python语言,即通过python操作数据库来实现简单的银行转账操作。

工具

python提供了python DB API用来统一操作数据库,使访问数据库的接口规范化,在没有python DB API之前,接口程序十分混乱,不同的数据库需要不同的操作接口,所以这个接口提供了极大的方便。在具体操作的时候,我们需要操作数据库以及其他逻辑的python代码,数据库连接对象connection来建立连接,数据库交互对象cursor来“运送”数据,一个健壮的系统必不可少的便是数据库异常类Exceptions。整个访问数据库流程如下图:

接下来分别介绍下两个主要对象:

connection:数据库连接对象,建立python客户端与数据库的网络连接。
创建方法:MySQLdb.connect(),包括的主要成员方法:
cursor():使用该连接创建并返回游标
commit():提交当前事务
rollback():回滚当前事务
close()关闭连接
cursor:游标对象,用于执行查询与获取结果,cursor对象支持的主要方法如下:
execute():执行SQL语句,将结果从数据库获取到客户端
fetchone():取得结果集的下一行
fetchmany(size):获取结果集的下size行
fetchall():获取结果集中剩下的所有行
rowcount:最近一次execute返回数据的行数
close():关闭游标对象
在上面的方法中提到了一个关键名词:事务,什么是事务呢?他是访问和更新数据的一个程序执行单元,很多操作的一个集合,有四个特点:

原子性:事物中包括的诸操作要么都做,要么都不做
一致性:事务必须使数据库从一致性状态变到另一个一致性状态
隔离型:一个事务的执行不被其他事务干扰
持久性:事务一旦提交,它对数据库的改变就是持久性的
事务的上述特点正是我们完成银行转账操作的关键。

具体实现

在开发中我们怎么样使用事务呢?

关闭自动commit()
正常结束事务:conn.commit(),
异常结束事务:conn.rollback()
在银行转账系统中,需要考虑如下需求:比如A给B转账,当A账户上减少了M钱时,必须在B账户上多了M钱,不能A减了B没加,也不能B加了A还没有减,当然账户必须是有效的,M钱的金额肯定要大于A账户上的金额。所以在具体设计的时候,需要将A账户的金钱减少和B账户的金钱增加作为一个事务,要么同时成功,要么一起失败。按照这个需求,书写代码,详细代码见github,代码复制和数据库如下,有两个账户,分别拥有金钱110和10,在运行代码的时候在参数栏输入1,2,100(source_acctid, target_acctid, tranfer_money)。

整个代码的逻辑如下:首先连接数据库,之后执行逻辑,然后断开数据库连接,执行的逻辑包括检查转账双方的账户是否有效,转账金额是否多于转账人的账户余额,分别给转账双方的帐号金额发生变化。如果正常结束事务,提交修改数据库,否则回滚。

#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, src, 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, target, 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, src, 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, target_acctid, money)
except Exception as e:
print e
finally:
conn.close()

总结

通过对数据库的操作就可以实现一个简单的银行转账系统,所以在系统开发的时候,我们应该尽最大的可能,让整个系统不只是多个组件的拼接,应该实现1+1>2。

(0)

相关推荐

  • php利用事务处理转账问题

    本文实例讲述了php+Mysqli利用事务处理转账问题的方法.分享给大家供大家参考 <?php header("Content-type:text/html; charset=utf-8"); $mysqli = new mysqli("localhost", "root", "064319", "php"); $mysqli->set_charset("utf8"); if

  • Android 高仿微信转账金钱输入框规则

    微信转账输入框规则(可能不全) 1.小数点后两位 2.起始输入小数点,显示0. 3.删除到第一个位置是小数点的时候,第一个位置为0 ,避免出现小数点在第一个位置的情况 修改这个朋友的规则而来,他的规则在保证小数点后两位有个小bug,已经修改 http://www.jb51.net/article/99361.htm 效果: @Override public CharSequence filter(CharSequence source, int start, int end, Spanned d

  • Python实现信用卡系统(支持购物、转账、存取钱)

    最近一直在做一个有关信用卡系统的项目,所有很少出来给大家打招呼了,今天也该告一段了,本项目是基于python编程语言做的,此信用卡支持购物,转账和存取钱,下面小编把需求及实现思路大概分享一下,仅供参考,如有bug欢迎各位大侠提出,共同学习进步,谢谢! 一.要求 二.思路 1.购物类buy 接收 信用卡类 的信用卡可用可用余额, 返回消费金额 2.信用卡(ATM)类 接收上次操作后,信用卡可用余额,总欠款,剩余欠款,存款 其中: 1.每种交易类型不单独处理金钱,也不单独记录流水账,每种交易类型调用

  • php+Mysqli利用事务处理转账问题实例

    本文实例讲述了php+Mysqli利用事务处理转账问题的方法.分享给大家供大家参考.具体实现方法如下: <?php header("Content-type:text/html; charset=utf-8"); $mysqli = new mysqli("localhost", "root", "064319", "php"); $mysqli->set_charset("utf8&

  • php+mysqli事务控制实现银行转账实例

    本文实例讲述了php+mysqli事务控制实现银行转账的方法.分享给大家供大家参考.具体分析如下: 事务控制,也就是说所有的语句执行成功后,才会提交.否则,如果前面有语句执行成功,而后面没有执行成功,则回滚到执行之前的状态.通过银行转账的案例来说明这个应用.一个账号转了钱出去,另一个账号必须有钱转入,这样才算成功. 代码如下: <?php //1.创建数据库连接对象 $mysqli = new MySQLi("localhost","root","1

  • 转账支票、现金支票日期大写对照表(数字大写)

    2012年大写:贰零壹贰年 2013年大写:贰零壹叁年 2014年大写:贰零壹肆年 2015年大写:贰零壹伍年 2016年大写:贰零壹陆年 2017年大写:贰零壹柒年 1月1日大写: 零壹月零壹日 1月2日大写: 零壹月零贰日 1月3日大写: 零壹月零叁日 1月4日大写: 零壹月零肆日 1月5日大写: 零壹月零伍日 1月6日大写: 零壹月零陆日 1月7日大写: 零壹月零柒日 1月8日大写: 零壹月零捌日 1月9日大写: 零壹月零玖日 1月10日大写: 零壹月壹拾日 1月11日大写: 零壹月壹拾壹

  • 实用的银行转账存储过程和流水号生成存储过程

    银行转账存储过程 USE [BankInfor] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[Transfer](@inAccount int,@outAccount int,@amount float) as declare @totalDeposit float; begin select @totalDeposit=total from Account where AccountNum

  • python 实现网上商城,转账,存取款等功能的信用卡系统

    一.要求 二.思路 1.购物类buy 接收 信用卡类 的信用卡可用可用余额, 返回消费金额 2.信用卡(ATM)类 接收上次操作后,信用卡可用余额,总欠款,剩余欠款,存款 其中: 1.每种交易类型不单独处理金钱,也不单独记录流水账,每种交易类型调用处理金钱的函数(传入交易类型,交易金额) 2.处理金钱的函数,调用配置文件中关于每种交易类型的加减钱和利率 返回本次操作后信用卡可用余额,总欠款,剩余欠款,存款 3.客户端 银行管理员注册登陆 普通用户注册登陆 发送需求:注册.登陆.交易类型.交易金额

  • PHP+Mysql基于事务处理实现转账功能的方法

    本文实例讲述了PHP+Mysql基于事务处理实现转账功能的方法.分享给大家供大家参考.具体如下: <?php header("Content-Type:text/html;charset=utf-8"); $mysqli=new mysqli("localhost","root","","test"); if(mysqli_connect_errno()) { printf("连接失败:%s

  • Python3连接MySQL(pymysql)模拟转账实现代码

    本文实例为大家分享了Python3连接MySQL模拟转账的具体实现代码,供大家参考,具体内容如下 # coding:utf8 import sys import pymysql class TransferMoney(object): def __init__(self,conn): self.conn=conn def check_acct_available(self,acctid): cursor = self.conn.cursor() try: sql="select * from a

  • 微信开发--企业转账到用户

    在微信公众号支付的API中没有这个接口,如果企业需要给用户转账,或者让用户提现或者给用户发红包等需要再商户平台中的产品中心分别开通. 一.开通功能 开通就是点击一下,很简单.但需要注意的是支持向用户转账的账户和收到用户付款的账户不是同一个,而为了满足此功能,你需要先用财付通进行充值(交易中心--资金管理--充值). 二.下载证书 证书下载在账户中心--API安全,现在需要手机验证码和商户平台登录密码.下载之后再window上进行安装,安装的密码是商户号. 安装之后并将证书放在网站目录下,用于下一

随机推荐