首頁 >後端開發 >Python教學 >python操作MySQL模擬銀行轉帳操作的簡單實例

python操作MySQL模擬銀行轉帳操作的簡單實例

黄舟
黄舟原創
2017-10-04 09:25:462459瀏覽

這篇文章主要介紹了python操作MySQL 模擬簡單銀行轉帳操作,需要的朋友可以參考下

一、基礎知識

1、MySQL-python的安裝

下載,然後pip install 安裝套件

2、python編寫通用資料庫程式的API規格

(1)、資料庫連接物件connection,建立python用戶端與資料庫的網路連接,建立方法為MySQLdb.Connect(參數)

     參數有六個:     host(MySQL伺服器位址一般本地為127.0.0.1)

                                     user(使用者名稱)
                                   db(資料庫名稱)
                  編碼)

     connection的方法: cursor()使用此連接並返回遊標

                 

                                                        close()關閉連接


(2)、資料庫遊標物件cursor,用於執行查詢和取得結果

    方法:execute(op[,args])執行一個資料庫查詢和命令

              fetchone()在下一行取得結果集的下一行

               

              rowcount 最近一次execute回傳資料的行數或影響行數

              close()關閉遊標物件

connection與cursor:connection相當於python與MySQL之間的道路,而cursor相當於路上的運輸車來傳送指令與結果。

3、簡單指令:

select  查詢資料:sql="select * from 表名所查項目"insert  插入資料:sql= “insert into 表名  所插項目”update 更改資料: sql=“updata 表名set  所插項目”

update 更改資料: sql=“updata 表名set  所改項目”

delete 刪除資料: sql=“delete from 表名所刪除項目”
wheresql指令的關鍵存在,通常是  where 表頭=列名來定位那一列


#4、交易

存取和更新資料庫的一個程式執行單元,所執行的命令,都可以稱為事務

具有原子性,一致性,隔離性,持久性

事務執行:

     conn.commit() 正常結束交易

     conn.rollback() 異常結束事務,對事務進行回滾,若程式執行單元中的連續的操作在進行中出錯,之前的操作還原。

簡單作業流程:    開始→ 建立connection →取得cursor → 程式執行單元→ 關閉cursor → 關閉connection → 結束

#二、模擬銀行轉帳系統代碼

#coding=utf-8 
import sys 
import MySQLdb 
''''' 
python操作MySQL数据库,模拟银行转账 
''' 
class Trans_for_Money(object): 
 #初始化 类 
 def __init__(self,conn): 
  self.conn = conn 
 #### 1、检查所输入的账号是否存在 #### 
 def check_acct_available(self,source_acctid): 
  #使用与数据库的链接并返回游标 
  cursor=self.conn.cursor() 
  try: 
   #数据库命令 
   sql="select * from tr_money where acctid=%s" %source_acctid 
   #执行命令 
   cursor.execute(sql) 
   #为方便观察执行过程 
   print "check_acct_available:" + sql 
   #讲结果集放入变量result中,若result不等于1,则没有这个账号,输出异常 
   result=cursor.fetchall() 
   if len(result)!=1: 
    raise Exception("账号%s不存在" %source_acctid) 
  finally: 
   #若过程出现问题,仍需要关闭游标对象 
   cursor.close() 
 #### 2、检查减款人余额是否充足,方法与上一个函数一样,只是多加了一个money参数 ### 
 def has_enough_money(self,source_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   sql="select * from tr_money where acctid=%s and money>%s" %(source_acctid,money) 
   cursor.execute(sql) 
   print "has_enough_money:" + sql 
   result=cursor.fetchall() 
   if len(result)!=1: 
    raise Exception("账号%s余额不足" %source_acctid) 
  finally: 
   cursor.close() 
 #### 3、减款操作 ### 
 def reduce_money(self,source_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   #数据库命令,减去对应减款人的金额数 
   sql="update tr_money set money=money-%s where acctid=%s" %(money,source_acctid) 
   cursor.execute(sql) 
   print "reduce_money:" + sql 
   #操作的execute()数据行数不等于1则减款失败 
   if cursor.rowcount!=1: 
    raise Exception("账号%s减款失败" %source_acctid) 
  finally: 
   cursor.close() 
 #### 4、收款操作,与减款方法相同 ### 
 def add_money(self,target_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   sql="update tr_money set money=money+%s where acctid =%s" %(money,target_acctid) 
   cursor.execute(sql) 
   print "add_money:" + sql 
   if cursor.rowcount!=1: 
    raise Exception("账号%s收款失败" %target_acctid) 
  finally: 
   cursor.close() 
 #### 5、分别传入参数,代入上方函数,执行操作 ### 
 def trans_for(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='12345678', 
       db='tt', 
       charset='utf8' 
       ) 
 #手动输入减款人、收款人、转款数 
 source_acctid=raw_input("请输入减款人: ") 
 target_acctid=raw_input("请输入收款人: ") 
 money=raw_input("请输入转款数: ") 
 #将参数传入类中 
 tr_money=Trans_for_Money(conn) 
 try: 
  tr_money.trans_for(source_acctid,target_acctid,money) 
 except Exception as e: 
  print"出现问题:"+str(e) 
 finally: 
  conn.close() 
  #关闭链接


三、問題解決

1、sys.argv [ ] 

因為教學影片中使用的IDE是MyEclipse,最後用run.Configuration 輸入參數,而我用的是pycharm,表示笨的找不到還是其實它沒有!

所以選擇用raw_input() 在執行過程中輸入參數

其實有去了解sys.argv[ ],但還是懂不太清楚。

2、  mysql_exceptions.IntegrityError: (1062, "Duplicate entry '7' for key 'PRIMARY'")

#這個錯誤表示你所要插入的資料已經存在,最好去觀察一下資料庫的資料與自己的程式操作是否有矛盾

3、MySql 建表或輸入數值時發生錯誤:1170-BLOB/TEXT column'name'used in key specification without a key length

#錯誤訊息為BLOB或TEXT欄位使用了未指定鍵值長度的鍵

解決方法:設定其他為主鍵  或   將資料形式改為varchar

具體解釋網址:http:/ /myhblog1989.blog.163.com/blog/static/183225376201110875818884/

4、TypeError: 'post' is an invalid keyword argument for this function

#or: “原因錯誤”是這個函數的無效參數

這個問題錯的很無語,一時腦子進水把“port”=3306 寫成了“post”='3306'

5、1054, "Unknown column 'acctid' in 'where clause'

錯誤原因:在where子句中找不到「acctid」欄位

呵呵,上個錯誤腦子進的水沒排出來,把表頭寫錯了…………

6、另外,還有一個錯誤是手動輸入的減款,收款人設為字母或漢字時找不到

可能是我程式碼或資料庫建表時的設定問題,表示在字元轉換和資料庫這方面還是小白一枚,繼續奮鬥吧! → 管理→ 服務與應用程式→ 服務→ 找到MySQL → 右鍵啟動

四、具體執行顯示

1、資料庫tr_money 表的初始狀態

2、程式碼執行,輸入減款人,收款人,轉款金額

3 、執行,結果出現程式碼中刻意print 的操作程序顯示

4、資料庫tr_money 表執行後狀態


#總結

以上是python操作MySQL模擬銀行轉帳操作的簡單實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn