python操作MySQL 模擬簡單銀行轉(zhuǎn)賬操作
一、基礎(chǔ)知識
1、MySQL-python的安裝
下載,然后 pip install 安裝包
2、python編寫通用數(shù)據(jù)庫程序的API規(guī)范
(1)、數(shù)據(jù)庫連接對象 connection,建立python客戶端與數(shù)據(jù)庫的網(wǎng)絡(luò)連接,創(chuàng)建方法為 MySQLdb.Connect(參數(shù))
參數(shù)有六個: host(MySQL服務(wù)器地址,一般本地為127.0.0.1)
port(MySQL服務(wù)器端口號)
user(用戶名)
passwd(密碼)
db(數(shù)據(jù)庫名稱)
charset(連接編碼)
connection的方法: cursor()使用該連接并返回游標(biāo)
commit()提交當(dāng)前事務(wù)
rollback()回滾當(dāng)前事務(wù)
close()關(guān)閉連接
(2)、數(shù)據(jù)庫游標(biāo)對象cursor,用于執(zhí)行查詢和獲取結(jié)果
方法:execute(op[,args])執(zhí)行一個數(shù)據(jù)庫查詢 和 命令
fetchone()取得結(jié)果集的下一行
fetchmany(size)獲取結(jié)果集的下幾行
fetchall()獲取結(jié)果集中剩下的所有行
rowcount 最近一次execute返回數(shù)據(jù)的行數(shù)或影響行數(shù)
close()關(guān)閉游標(biāo)對象
connection與cursor:connection相當(dāng)于python與MySQL之間的路,而cursor相當(dāng)于路上的運輸車來傳送命令與結(jié)果。
3、簡單命令:
select 查詢數(shù)據(jù):sql="select * from 表名 所查項目"
insert 插入數(shù)據(jù):sql=“insert into 表名 所插項目”
update 更改數(shù)據(jù): sql=“updata 表名 set 所改項目 ”
delete 刪除數(shù)據(jù): sql=“delete from 表名 所刪項目”
where也是sql命令的關(guān)鍵存在,通常是 where 表頭=列名 來定位那一列
4、事務(wù)
訪問和更新數(shù)據(jù)庫的一個程序執(zhí)行單元,所執(zhí)行的命令,都可以稱為事務(wù)
具有原子性,一致性,隔離性,持久性
事務(wù)執(zhí)行:
conn.commit() 正常結(jié)束事務(wù)
conn.rollback() 異常結(jié)束事務(wù),對事務(wù)進(jìn)行回滾,若程序執(zhí)行單元中的連續(xù)的操作在進(jìn)行中出錯,之前的操作還原。
簡單操作過程: 開始 → 創(chuàng)建connection →獲取cursor → 程序執(zhí)行單元 → 關(guān)閉cursor → 關(guān)閉connection → 結(jié)束
二、模擬銀行轉(zhuǎn)賬系統(tǒng)代碼
#coding=utf-8
import sys
import MySQLdb
'''''
python操作MySQL數(shù)據(jù)庫,模擬銀行轉(zhuǎn)賬
'''
class Trans_for_Money(object):
#初始化 類
def __init__(self,conn):
self.conn = conn
#### 1、檢查所輸入的賬號是否存在 ####
def check_acct_available(self,source_acctid):
#使用與數(shù)據(jù)庫的鏈接并返回游標(biāo)
cursor=self.conn.cursor()
try:
#數(shù)據(jù)庫命令
sql="select * from tr_money where acctid=%s" %source_acctid
#執(zhí)行命令
cursor.execute(sql)
#為方便觀察執(zhí)行過程
print "check_acct_available:" + sql
#講結(jié)果集放入變量result中,若result不等于1,則沒有這個賬號,輸出異常
result=cursor.fetchall()
if len(result)!=1:
raise Exception("賬號%s不存在" %source_acctid)
finally:
#若過程出現(xiàn)問題,仍需要關(guān)閉游標(biāo)對象
cursor.close()
#### 2、檢查減款人余額是否充足,方法與上一個函數(shù)一樣,只是多加了一個money參數(shù) ###
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:
#數(shù)據(jù)庫命令,減去對應(yīng)減款人的金額數(shù)
sql="update tr_money set money=money-%s where acctid=%s" %(money,source_acctid)
cursor.execute(sql)
print "reduce_money:" + sql
#操作的execute()數(shù)據(jù)行數(shù)不等于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、分別傳入?yún)?shù),代入上方函數(shù),執(zhí)行操作 ###
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)
#提交當(dāng)前事務(wù)
self.conn.commit()
except Exception as e:
#若出錯,回滾當(dāng)前事務(wù)
self.conn.rollback()
raise e
if __name__=="__main__":
# source_acctid=sys.argv[1]
# target_acctid=sys.argv[2]
# money=sys.argv[3]
#建立與數(shù)據(jù)庫的鏈接
conn = MySQLdb.Connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='12345678',
db='tt',
charset='utf8'
)
#手動輸入減款人、收款人、轉(zhuǎn)款數(shù)
source_acctid=raw_input("請輸入減款人: ")
target_acctid=raw_input("請輸入收款人: ")
money=raw_input("請輸入轉(zhuǎn)款數(shù): ")
#將參數(shù)傳入類中
tr_money=Trans_for_Money(conn)
try:
tr_money.trans_for(source_acctid,target_acctid,money)
except Exception as e:
print"出現(xiàn)問題:"+str(e)
finally:
conn.close()
#關(guān)閉鏈接
三、問題解決
1、sys.argv[ ]
因為教學(xué)視頻中用的IDE是MyEclipse,最后用run.Configuration 輸入?yún)?shù),而我用的是pycharm,表示笨的找不到還是其實它沒有!
所以選擇用raw_input() 在執(zhí)行過程中輸入?yún)?shù)
其實有去了解sys.argv[ ],但還是懂不太清楚。
2、 mysql_exceptions.IntegrityError: (1062, "Duplicate entry '7' for key 'PRIMARY'")
這個錯誤表示你所要插入的數(shù)據(jù)已經(jīng)存在,最好去觀察一下數(shù)據(jù)庫的數(shù)據(jù)與自己的程序操作是否有矛盾
3、MySql 建表或輸入數(shù)值時出錯:1170-BLOB/TEXT column‘name'used in key specification without a key length
錯誤信息為BLOB或者TEXT字段使用了未指定鍵值長度的鍵
解決方法:設(shè)置其他為主鍵 或 將數(shù)據(jù)形式改為varchar
具體解釋網(wǎng)址:http://myhblog1989.blog.163.com/blog/static/183225376201110875818884/
4、TypeError: 'post' is an invalid keyword argument for this function
錯誤原因:TypeError: “post”是這個函數(shù)的無效參數(shù)
這個問題錯的很無語,一時腦子進(jìn)水把 “port”=3306 寫成了“post”=‘3306'
5、1054, "Unknown column 'acctid' in 'where clause'
錯誤原因:在where子句中找不到“acctid”列
呵呵,上個錯誤腦子進(jìn)的水沒排出來,把表頭寫錯了…………
6、另外,還有一個錯誤是手動輸入的減款,收款人設(shè)為字母或漢字時找不到
可能是我代碼或數(shù)據(jù)庫建表時的設(shè)定問題,表示在字符轉(zhuǎn)換和數(shù)據(jù)庫這方面還是小白一枚,繼續(xù)奮斗吧!
7、MySQL數(shù)據(jù)庫的啟動
計算機(jī) → 右鍵 → 管理 → 服務(wù)和應(yīng)用程序 → 服務(wù) → 找到MySQL → 右鍵啟動
四、具體執(zhí)行顯示
1、數(shù)據(jù)庫 tr_money 表的初始狀態(tài)

2、代碼執(zhí)行,輸入減款人,收款人,轉(zhuǎn)款數(shù)額

3、執(zhí)行,結(jié)果出現(xiàn)代碼中特意 print 的操作進(jìn)程顯示

4、數(shù)據(jù)庫 tr_money 表執(zhí)行后狀態(tài)

總結(jié)
以上所述是小編給大家介紹的python 操作mysql 模擬銀行轉(zhuǎn)賬,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
python學(xué)生信息管理系統(tǒng)實現(xiàn)代碼
這篇文章主要介紹了python學(xué)生信息管理系統(tǒng)的實現(xiàn)代碼,代碼簡單,復(fù)制即可使用,需要的朋友可以參考下2019-12-12
python實現(xiàn)簡易內(nèi)存監(jiān)控
這篇文章主要介紹了python實現(xiàn)簡易內(nèi)存監(jiān)控,每隔3秒獲取系統(tǒng)內(nèi)存,當(dāng)內(nèi)存超過設(shè)定的警報值時,獲取所有進(jìn)程占用內(nèi)存并發(fā)出警報聲,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06

