python操作MySQL 類比簡單銀行轉賬操作

來源:互聯網
上載者:User

標籤:

一、基礎知識

1、MySQL-python的安裝

下載,然後 pip install 安裝包


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


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

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

                            port(MySQL伺服器連接埠號碼)

                            user(使用者名稱)

                            passwd(密碼)

                            db(資料庫名稱)

                            charset(串連編碼)

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

                                      commit()提交當前事務

                                      rollback()復原當前事務

                                      close()關閉串連


(2)、資料庫遊標對象cursor,用於執行查詢和擷取結果

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

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

              fetchmany(size)擷取結果集的下幾行

              fetchall()擷取結果集中剩下的所有行

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

              close()關閉遊標對象


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

                       

3、簡單命令:

select  查詢資料:sql="select * from 表名 所查項目"

insert  插入資料:sql=“insert into 表名  所插項目”

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

delete 刪除資料: sql=“delete from 表名 所刪項目”

where也是sql命令的關鍵存在,通常是  where 表頭=列名 來定位那一列


4、事務

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

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

事務執行:

     conn.commit() 正常結束事務

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


簡單操作過程:    開始 → 建立connection →擷取cursor → 程式執行單元 → 關閉cursor → 關閉connection → 結束


二、類比銀行轉賬系統代碼


#coding=utf-8import sysimport 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 eif __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

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

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


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

錯誤原因:在where子句中找不到“acctid”列

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


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

可能是我代碼或資料庫建表時的設定問題,表示在字元轉換和資料庫這方面還是小白一枚,繼續奮鬥吧!


7、MySQL資料庫的啟動

電腦 → 右鍵 → 管理 → 服務和應用程式 → 服務 → 找到MySQL → 右鍵啟動


四、具體執行顯示

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


2、代碼執行,輸入減款人,收款人,轉款數額


3、執行,結果出現代碼中特意 print 的操作進程顯示


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





python操作MySQL 類比簡單銀行轉賬操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.