這篇文章主要介紹了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,用於執行查詢和取得結果
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中文網其他相關文章!