最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python實現(xiàn)一個簡單的銀行轉(zhuǎn)賬操作

 更新時間:2016年03月06日 13:28:51   作者:cotyb  
這篇文章主要介紹了基于Python實現(xiàn)一個簡單的銀行轉(zhuǎn)賬操作的相關(guān)資料,需要的朋友可以參考下

前言

在進行一個應(yīng)用系統(tǒng)的開發(fā)過程中,從上到下一般需要四個構(gòu)件:客戶端-業(yè)務(wù)邏輯層-數(shù)據(jù)訪問層-數(shù)據(jù)庫,其中數(shù)據(jù)訪問層是一個底層、核心的技術(shù)。而且在實際開發(fā)中,數(shù)據(jù)庫的操作也就是說數(shù)據(jù)訪問層都是嵌套在其他語言中的,其是編程的核心。本文面向的是python語言,即通過python操作數(shù)據(jù)庫來實現(xiàn)簡單的銀行轉(zhuǎn)賬操作。

工具

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

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

connection:數(shù)據(jù)庫連接對象,建立python客戶端與數(shù)據(jù)庫的網(wǎng)絡(luò)連接。
創(chuàng)建方法:MySQLdb.connect(),包括的主要成員方法:
cursor():使用該連接創(chuàng)建并返回游標(biāo)
commit():提交當(dāng)前事務(wù)
rollback():回滾當(dāng)前事務(wù)
close()關(guān)閉連接
cursor:游標(biāo)對象,用于執(zhí)行查詢與獲取結(jié)果,cursor對象支持的主要方法如下:
execute():執(zhí)行SQL語句,將結(jié)果從數(shù)據(jù)庫獲取到客戶端
fetchone():取得結(jié)果集的下一行
fetchmany(size):獲取結(jié)果集的下size行
fetchall():獲取結(jié)果集中剩下的所有行
rowcount:最近一次execute返回數(shù)據(jù)的行數(shù)
close():關(guān)閉游標(biāo)對象
在上面的方法中提到了一個關(guān)鍵名詞:事務(wù),什么是事務(wù)呢?他是訪問和更新數(shù)據(jù)的一個程序執(zhí)行單元,很多操作的一個集合,有四個特點:

原子性:事物中包括的諸操作要么都做,要么都不做
一致性:事務(wù)必須使數(shù)據(jù)庫從一致性狀態(tài)變到另一個一致性狀態(tài)
隔離型:一個事務(wù)的執(zhí)行不被其他事務(wù)干擾
持久性:事務(wù)一旦提交,它對數(shù)據(jù)庫的改變就是持久性的
事務(wù)的上述特點正是我們完成銀行轉(zhuǎn)賬操作的關(guān)鍵。

具體實現(xiàn)

在開發(fā)中我們怎么樣使用事務(wù)呢?

關(guān)閉自動commit()
正常結(jié)束事務(wù):conn.commit(),
異常結(jié)束事務(wù):conn.rollback()
在銀行轉(zhuǎn)賬系統(tǒng)中,需要考慮如下需求:比如A給B轉(zhuǎn)賬,當(dāng)A賬戶上減少了M錢時,必須在B賬戶上多了M錢,不能A減了B沒加,也不能B加了A還沒有減,當(dāng)然賬戶必須是有效的,M錢的金額肯定要大于A賬戶上的金額。所以在具體設(shè)計的時候,需要將A賬戶的金錢減少和B賬戶的金錢增加作為一個事務(wù),要么同時成功,要么一起失敗。按照這個需求,書寫代碼,詳細(xì)代碼見github,代碼復(fù)制和數(shù)據(jù)庫如下,有兩個賬戶,分別擁有金錢110和10,在運行代碼的時候在參數(shù)欄輸入1,2,100(source_acctid, target_acctid, tranfer_money)。

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

#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()

總結(jié)

通過對數(shù)據(jù)庫的操作就可以實現(xiàn)一個簡單的銀行轉(zhuǎn)賬系統(tǒng),所以在系統(tǒng)開發(fā)的時候,我們應(yīng)該盡最大的可能,讓整個系統(tǒng)不只是多個組件的拼接,應(yīng)該實現(xiàn)1+1>2。

相關(guān)文章

  • Python入門教程(十九)python的函數(shù)詳解

    Python入門教程(十九)python的函數(shù)詳解

    這篇文章主要介紹了Python入門教程(十九)python的函數(shù),函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段,需要的朋友可以參考下
    2023-04-04
  • Python+OpenCV實現(xiàn)單個圓形孔和針檢測

    Python+OpenCV實現(xiàn)單個圓形孔和針檢測

    這篇文章主要為大家詳細(xì)介紹了如何通過Python+OpenCV實現(xiàn)單個圓形孔和針檢測功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-10-10
  • 記一次python 爬蟲爬取深圳租房信息的過程及遇到的問題

    記一次python 爬蟲爬取深圳租房信息的過程及遇到的問題

    這篇文章主要介紹了記一次python 爬蟲爬取深圳租房信息的過程,幫助大家更好的理解和學(xué)習(xí)python爬蟲,感興趣的朋友可以了解下
    2020-11-11
  • python程序 線程隊列queue使用方法解析

    python程序 線程隊列queue使用方法解析

    這篇文章主要介紹了python程序 線程隊列queue使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 在Python中關(guān)于使用os模塊遍歷目錄的實現(xiàn)方法

    在Python中關(guān)于使用os模塊遍歷目錄的實現(xiàn)方法

    今天小編就為大家分享一篇在Python中關(guān)于使用os模塊遍歷目錄的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python pandas 解析(讀取、寫入)CSV 文件的操作方法

    python pandas 解析(讀取、寫入)CSV 文件的操作方法

    這篇文章主要介紹了python pandas 解析(讀取、寫入) CSV 文件,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • python中的多進程的創(chuàng)建與啟動方式

    python中的多進程的創(chuàng)建與啟動方式

    這篇文章主要介紹了python中的多進程的創(chuàng)建與啟動,python中的并發(fā)有三種形式,多進程、多線程、協(xié)程,執(zhí)?并發(fā)任務(wù)的?的是為了提?程序運?的效率,本文通過實例代碼詳細(xì)講解需要的朋友可以參考下
    2022-12-12
  • python 使用csv模塊讀寫csv格式文件的示例

    python 使用csv模塊讀寫csv格式文件的示例

    這篇文章主要介紹了python 使用csv模塊讀寫csv格式文件的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • Python的加密模塊之hashlib 與 base64詳解及常用加密方法

    Python的加密模塊之hashlib 與 base64詳解及常用加密方法

    我們來學(xué)習(xí)一下 Python 中的加密模塊,加密模塊在工作中被廣泛應(yīng)用,比如數(shù)據(jù)的傳入 不希望被捕獲,通過把數(shù)據(jù)加密。這樣即使被捕獲也無法獲取到數(shù)據(jù)的真實信息,今天我們就來學(xué)習(xí)一下關(guān)于加密的方法,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • 對python3中pathlib庫的Path類的使用詳解

    對python3中pathlib庫的Path類的使用詳解

    今天小編就為大家分享一篇對python3中pathlib庫的Path類的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10

最新評論

江孜县| 米脂县| 博爱县| 凤翔县| 博乐市| 社会| 祁门县| 东兰县| 东乡县| 东乡县| 如皋市| 吉首市| 衢州市| 梁山县| 万宁市| 高淳县| 东兴市| 康定县| 白玉县| 阳原县| 蓬莱市| 和田县| 金昌市| 若羌县| 贡觉县| 沧州市| 滁州市| 潞西市| 宜春市| 和龙市| 茌平县| 奉化市| 来宾市| 阿尔山市| 长海县| 泰和县| 成都市| 温州市| 收藏| 谢通门县| 大姚县|