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。
更多Python實現一個簡單的銀行轉帳操作方法相關文章請關注PHP中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

VS Code 擴展存在惡意風險,例如隱藏惡意代碼、利用漏洞、偽裝成合法擴展。識別惡意擴展的方法包括:檢查發布者、閱讀評論、檢查代碼、謹慎安裝。安全措施還包括:安全意識、良好習慣、定期更新和殺毒軟件。
