python配置MySQL(下)python銀行轉賬例項
阿新 • • 發佈:2018-11-04
python銀行轉賬例項
基於慕課網瘋狂的螞蟻crazyant講師學習python MYSQL操作,例項執行成功。
程式碼流程:
建立表:
1、語句執行(出錯)
2、視覺化操作:
(引擎設定為InnoDB, 不能設為MYISAM。因為MYISAM不支援事務操作,導致事務無法回滾,導致資料庫轉賬金額出現錯誤的情況)
程式碼編寫過程自頂向下,從抽象到具體
(pycharm快捷鍵:Alt+Enter ;eclipse快捷鍵: Ctrl+1)可選中函式實現自動建立類、方法
在 PyCharm 中設定相關的執行引數:賬戶A的ID,賬戶B的ID,轉賬金額
【Run】⇒ 【Edit Configurations】⇒ 【parameters】
執行程式碼:
(注意事項:拼寫錯誤要留意,否則會報錯)
# -*- coding:utf-8 -*- # __author__ = 'yang' #1、編寫指令碼執行入口 import sys import MySQLdb #建立類的建構函式conn;實現transfer方法編寫轉賬操作 #實現轉賬操作函式:(正常轉賬成功則提交事務,否則回滾事務,異常重新丟擲) #1.建立資料庫連線 #2.檢測兩個賬號ID是否可用:獲取cursor;建立sql語句;執行sql並列印結果用於除錯;把查詢的結果集放在變數rs;判斷rs長度不為1,則賬戶不存在 #3.檢查付款人是否有足夠的錢 #4.付款人減金額: if cursor.rowcount != 1:表示該語句影響了資料庫多少行資料 #5.收款人加相應金額 class TransferMeney(object): def __init__(self, conn): self.conn = conn def check_acct_available(self, acctid): cursor = self.conn.cursor() try: sql = "select * from account where acctid=%s"%acctid cursor.execute(sql) print "check_acct_available:"+sql rs = cursor.fetchall() if len(rs)!=1: raise Exception("賬戶%s不存在"%acctid) finally: cursor.close() def has_enough_money(self, acctid, money): cursor = self.conn.cursor() try: sql = "select * from account where acctid=%s and money>%s" % (acctid,money) cursor.execute(sql) print "has_enough_money:" + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception("賬號%s沒有足夠的錢" % acctid) finally: cursor.close() def reduce_money(self, acctid, money): cursor = self.conn.cursor() try: sql = "update account set money=money-%s where acctid=%s" % (money, acctid) cursor.execute(sql) print "reduce_money:" + sql if cursor.rowcount != 1: raise Exception("賬號%s減款失敗" % acctid) finally: cursor.close() def add_money(self, acctid, money): cursor = self.conn.cursor() try: sql = "update account set money=money+%s where acctid=%s" % (money, acctid) cursor.execute(sql) print "add_money:" + sql if cursor.rowcount != 1: raise Exception("賬號%s加款失敗" % acctid) finally: cursor.close() def Transfer(self,source_acctid, target_acctid, money): try: self.check_acct_available(source_acctid) self.check_acct_available(target_acctid) self.has_enough_money(source_acctid, money) self.reduce_money(source_acctid, money) self.add_money(target_acctid, money) self.conn.commit() except Exception as e: self.conn.rollback() raise e 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', port=3306, user='root', passwd='', db='imooc', charset='utf8') tr_money = TransferMeney(conn) try: tr_money.Transfer(source_acctid, target_acctid, money) except Exception as e: print "出現問題:" + str(e) #1、運用if語句,接收三個引數,分別是付款人賬戶ID、收款人賬戶ID、轉賬金額 #2、建立資料庫連線,將資料庫傳入物件;建立一個物件,進行轉賬操作。使用一個類TransferMeney()來實現整個邏輯 #3、進行轉賬操作:傳入三個引數(若出現異常,將錯誤列印;最後關閉整個流程);
執行結果:
檢查11賬號是否存在;
檢查12賬號是否存在;
檢查金額是否滿足;
加金額;
減金額;
檢視資料庫:
原表:
重新整理後,轉賬成功: