1. 程式人生 > >python配置MySQL(下)python銀行轉賬例項

python配置MySQL(下)python銀行轉賬例項

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賬號是否存在;
檢查金額是否滿足;
加金額;
減金額;
在這裡插入圖片描述
檢視資料庫:
原表:
在這裡插入圖片描述
重新整理後,轉賬成功:
在這裡插入圖片描述