亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

基于Python實現一個簡單的銀行轉賬操作

2020-01-04 17:39:09
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了基于Python實現一個簡單的銀行轉賬操作的相關資料,需要的朋友可以參考下
 

前言

在進行一個應用系統的開發過程中,從上到下一般需要四個構件:客戶端-業務邏輯層-數據訪問層-數據庫,其中數據訪問層是一個底層、核心的技術。而且在實際開發中,數據庫的操作也就是說數據訪問層都是嵌套在其他語言中的,其是編程的核心。本文面向的是python語言,即通過python操作數據庫來實現簡單的銀行轉賬操作。

工具

python提供了python DB API用來統一操作數據庫,使訪問數據庫的接口規范化,在沒有python DB API之前,接口程序十分混亂,不同的數據庫需要不同的操作接口,所以這個接口提供了極大的方便。在具體操作的時候,我們需要操作數據庫以及其他邏輯的python代碼,數據庫連接對象connection來建立連接,數據庫交互對象cursor來“運送”數據,一個健壯的系統必不可少的便是數據庫異常類Exceptions。整個訪問數據庫流程如下圖:

基于Python實現一個簡單的銀行轉賬操作

接下來分別介紹下兩個主要對象:

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)。

基于Python實現一個簡單的銀行轉賬操作

整個代碼的邏輯如下:首先連接數據庫,之后執行邏輯,然后斷開數據庫連接,執行的邏輯包括檢查轉賬雙方的賬戶是否有效,轉賬金額是否多于轉賬人的賬戶余額,分別給轉賬雙方的帳號金額發生變化。如果正常結束事務,提交修改數據庫,否則回滾。

#coding:utf-8import sysimport MySQLdbclass TransferMoney():def __init__(self, conn):self.conn = conndef 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 eself.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" %accitcursor.execute(sql)print "check_acct_available: " + sqlrs = 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: " + sqlrs = 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 efinally:conn.close()

總結

通過對數據庫的操作就可以實現一個簡單的銀行轉賬系統,所以在系統開發的時候,我們應該盡最大的可能,讓整個系統不只是多個組件的拼接,應該實現1+1>2。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本欧美一级片| 欧美在线视频在线播放完整版免费观看| 97国产成人精品视频| 亚洲区中文字幕| 国产成人综合av| 久久久久久com| 亚洲欧洲成视频免费观看| 欧美激情综合色综合啪啪五月| 亚洲自拍欧美另类| 欧美专区第一页| 欧美激情在线视频二区| 亚洲一区中文字幕在线观看| 欧美成人免费网| 亚洲色图偷窥自拍| 久久精品亚洲94久久精品| 久久久久99精品久久久久| 亚洲美女www午夜| 91久久久久久国产精品| 在线看日韩欧美| 国产极品jizzhd欧美| 久久色精品视频| 久久久久久av| 美日韩丰满少妇在线观看| 疯狂欧美牲乱大交777| 久久人人爽人人爽人人片亚洲| 亚洲精品www久久久| 欧美激情在线观看视频| 久久综合九色九九| 欧美一级在线亚洲天堂| 国产精品三级久久久久久电影| 国产经典一区二区| 欧美亚洲国产成人精品| 欧美一区二区三区精品电影| 91牛牛免费视频| 日韩av片电影专区| 国产成人精品久久亚洲高清不卡| 日韩一级黄色av| 欧美性黄网官网| 亚洲另类xxxx| 国产精品成人在线| 亚洲精品一区二区三区婷婷月| 91夜夜揉人人捏人人添红杏| 91久久在线观看| 国产精品久久久久久久久借妻| 久久综合国产精品台湾中文娱乐网| 2024亚洲男人天堂| 日韩精品中文字幕久久臀| 亚洲激情视频在线播放| 久久6精品影院| 欧美电影电视剧在线观看| 91性高湖久久久久久久久_久久99| 亚洲精品美女久久| 亚洲aaaaaa| 成人情趣片在线观看免费| 日本道色综合久久影院| 一区二区三区无码高清视频| yw.139尤物在线精品视频| 国产精品丝袜久久久久久高清| 亚洲男人天堂2024| 日韩精品在线播放| 国产欧美日韩视频| 日韩免费高清在线观看| 国产精品第2页| 欧美刺激性大交免费视频| 欧美性猛交99久久久久99按摩| 欧美专区福利在线| 国产亚洲一区精品| 午夜精品久久久久久久久久久久| 国产成人午夜视频网址| 国内伊人久久久久久网站视频| 91豆花精品一区| 久久久久在线观看| 国产亚洲一区二区精品| 欧美电影第一页| 亚洲一级片在线看| 啊v视频在线一区二区三区| 欧美性xxxxhd| 日韩中文在线不卡| 国产精品aaaa| 精品日韩视频在线观看| 粉嫩老牛aⅴ一区二区三区| 美女福利视频一区| 国模gogo一区二区大胆私拍| 一区二区三区视频免费| 色悠久久久久综合先锋影音下载| 亚洲男人天堂手机在线| 国产精品免费久久久久影院| 欧美精品免费播放| 日韩免费在线电影| 草民午夜欧美限制a级福利片| 81精品国产乱码久久久久久| 亚洲精品99久久久久| 久久激情视频久久| 久久精品国产久精国产一老狼| 久久久久久久久久久免费| 亚洲欧美日韩一区在线| 日本人成精品视频在线| 欧美另类xxx| 川上优av一区二区线观看| 国产欧美日韩精品专区| 日韩美女激情视频| 久久亚洲精品成人| 日韩精品在线看| 永久免费毛片在线播放不卡| 亚洲黄色av女优在线观看| 日韩精品在线免费播放| 欧美野外猛男的大粗鳮| 一区二区三区 在线观看视| 91国产美女在线观看| 国产精品久久久久久久久久久久| 国产成人精品在线| 亚洲精品久久久久| 永久免费看mv网站入口亚洲| 国产精品av网站| 欧美日韩日本国产| 国产精品美女视频网站| 成人av资源在线播放| 亚洲美女自拍视频| 久久久午夜视频| 日本精品中文字幕| 国产日韩欧美在线看| 亚洲视频欧美视频| 国产精品入口福利| 日韩国产精品一区| 国产精品久久二区| 庆余年2免费日韩剧观看大牛| 久久综合亚洲社区| 亚洲欧美三级在线| 精品亚洲aⅴ在线观看| 欧美成人免费播放| 国产精品福利网| 国产精品高清网站| 亚洲成人三级在线| 精品国产一区二区三区在线观看| 一区二区三区视频免费在线观看| 疯狂做受xxxx欧美肥白少妇| 韩国三级电影久久久久久| 欧美成人精品h版在线观看| 亚洲视频自拍偷拍| 亚洲欧美日韩直播| 欧美极品欧美精品欧美视频| 国产精品爽黄69| 日韩国产一区三区| 韩日精品中文字幕| 亚洲综合色av| 亚洲乱亚洲乱妇无码| 成人看片人aa| 日本久久91av| 亚洲国产精品一区二区三区| 亚洲一区二区三区在线免费观看| 亚洲欧美中文在线视频| 精品视频久久久久久| 久久人人爽人人爽人人片亚洲| 日本一区二区在线免费播放| 97色在线视频观看| 国产69精品久久久久9999| 国语自产精品视频在免费| 精品女同一区二区三区在线播放| 欧美亚洲激情视频| 欧美日韩美女在线| 青青草精品毛片| 国产欧美日韩亚洲精品| 国产精品小说在线| 国产欧美欧洲在线观看|