專欄:008:MySQLdb及其銀行模擬轉(zhuǎn)賬

用理工科思維看待這個(gè)世界

系列爬蟲(chóng)專欄

崇尚的學(xué)習(xí)思維是:輸入,輸出平衡,且平衡點(diǎn)不斷攀升。

曾經(jīng)有大神告誡說(shuō):沒(méi)事別瞎寫文章;所以,很認(rèn)真的寫的是能力范圍內(nèi)的,看客要是看不懂,不是你的問(wèn)題,問(wèn)題在我,得持續(xù)輸入,再輸出。

今天的主題是:MySQLdb及其銀行模擬轉(zhuǎn)賬

1:框架

序號(hào) 內(nèi)容 說(shuō)明
01 概念及其工具介紹 --
02 SQL語(yǔ)句 --
03 實(shí)例演示數(shù)據(jù)庫(kù)操作 --
04 銀行轉(zhuǎn)賬操作演示 --
05 參考及其說(shuō)明 --

2:概念,工具介紹

  • MySQL:關(guān)系型數(shù)據(jù)庫(kù)
    MySQL(官方發(fā)音為英語(yǔ)發(fā)音:/ma? ??skju???l/“My S-Q-L”[1],但也經(jīng)常讀作英語(yǔ)發(fā)音:/ma? ?si?kw?l/“My Sequel”)原本是一個(gè)開(kāi)放源代碼的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),原開(kāi)發(fā)者為瑞典的MySQL AB公司,該公司于2008年被昇陽(yáng)微系統(tǒng)(Sun Microsystems)收購(gòu)。2009年,甲骨文公司(Oracle)收購(gòu)昇陽(yáng)微系統(tǒng)公司,MySQL成為Oracle旗下產(chǎn)品。

  • MySQL 服務(wù)器的 下載:官網(wǎng)

  • python MySQL 驅(qū)動(dòng) 安裝: 下載安裝

  • python MySQL 開(kāi)發(fā)環(huán)境

01:Python 集成開(kāi)發(fā)環(huán)境編寫SQL語(yǔ)句
02:python客戶端 + python MySQL 驅(qū)動(dòng)
03:MySQL 服務(wù)器:MySQL客戶端工具

本地需要先開(kāi)啟MySQL服務(wù),python編寫SQL語(yǔ)句,驅(qū)動(dòng)完成python和MySQL之間的聯(lián)系。這樣就可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)的增刪改查。


3:SQL語(yǔ)句

  • SQL語(yǔ)句
    SQL是用于訪問(wèn)和處理數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)的計(jì)算機(jī)語(yǔ)言:
    教程w3school
    基本操作:增刪改查

  • 查:
    SELECT 列名稱 FROM 表名稱
    一個(gè)名為"Persons"的表:提取LastName列:select LastName from Persons

001.png

結(jié)果:


002.png
  • 改:
    UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值

  • 增:
    01:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 02:INSERT INTO 表名稱 VALUES (值1, 值2,....)

  • 刪:
    DELETE FROM 表名稱 WHERE 列名稱 = 值

還有好些高級(jí)的用法....點(diǎn)這里

這里主要講解在python中的使用。


4:代碼演示

  • MySQLdb

01: 創(chuàng)建連接對(duì)象

序號(hào) 方法 使用說(shuō)明
01 MySQLdb.connet() 創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象

|參數(shù)|類型|說(shuō)明|
|---|---|
|host|字符串|MySQL服務(wù)器地址,本地:localhost|
|port|數(shù)字|MySQL服務(wù)器端口號(hào)|
|user|字符串|用戶名,默認(rèn)root|
|passwd|字符串|密碼,默認(rèn)空|
|db|字符串|數(shù)據(jù)庫(kù)名稱|
|charset|字符串|連接編碼|

02:連接對(duì)象支持的方法

方法名 說(shuō)明
cursor() 游標(biāo)對(duì)象:用于查詢和獲取結(jié)果
commit() 提交當(dāng)前事務(wù)
rollback() 回滾當(dāng)前事務(wù)
close() 關(guān)閉連接

03:游標(biāo)對(duì)象 所支持的方法

方法 說(shuō)明
execute() 執(zhí)行一個(gè)數(shù)據(jù)庫(kù)查詢和命令
fetchone() 取結(jié)果集的下一個(gè)
fetchmany(size) 獲取結(jié)果集下幾行
fetchall() 獲取剩下的所有
rowcount 最近一次execute影響的行數(shù)
close() 關(guān)閉游標(biāo)對(duì)象

04:使用MySQLdb的方法流程

  • connection:建立數(shù)據(jù)庫(kù)連接
  • cursor: 執(zhí)行SQL,獲取數(shù)據(jù)庫(kù)數(shù)據(jù)
  • 提交事務(wù)或者回滾操作
  • 關(guān)閉cursor,關(guān)閉connection連接對(duì)象

數(shù)據(jù)庫(kù)可視化工具:SQLyog (有好些,看你自己喜好了)
在本地已經(jīng)手工創(chuàng)建了一個(gè)db = exercise的數(shù)據(jù)庫(kù),表名為:persons如圖:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
# 獲取第一行
import MySQLdb
connector = MySQLdb.connect(
    user="root",
    host="localhost",
    port=3306,
    passwd="123456",
    db="exercise",
    charset="utf8")  # 創(chuàng)建連接對(duì)象
cur = connector.cursor()  # 創(chuàng)建游標(biāo)對(duì)象
sql = 'select * from persons WHERE id =1' # 編寫的Sql語(yǔ)句
cur.execute(sql) # 使用游標(biāo)對(duì)象的執(zhí)行方法 
print(cur.fetchone()) # 使用右邊對(duì)象的獲取方法
# output
(1, 'Adams', 'John', 'Oxford Street', 'London')
# 第一行的FirstName 更改成 'xiexiaolu'
sql2 = "UPDATE persons SET FirstName = 'xiexiaolu' WHERE id = 1"
cur.execute(sql2)

# 表數(shù)據(jù)變成
(1, 'Adams', 'xiexiaolu', 'Oxford Street', 'London')
(2, 'Bush', 'George', 'Fifth Avenue', 'New York')
(3, 'Carter', 'Thomas', 'Changan Street', 'Beijing')

# 增加一條數(shù)據(jù)
sql3 ="INSERT INTO persons(Id, LastName,FirstName,Address,City)VALUES (4, 'xiaolu', 'xie','zhabei','shanghai')"

# output
(1, 'Adams', 'John', 'Oxford Street', 'London')
(2, 'Bush', 'George', 'Fifth Avenue', 'New York')
(3, 'Carter', 'Thomas', 'Changan Street', 'Beijing')
(4, 'xiaolu', 'xie', 'zhabei', 'shanghai')

更多操作


5:銀行轉(zhuǎn)賬操作演示

模擬銀行兩個(gè)賬戶之間的資金流動(dòng):
流程:

  • 檢查賬戶是否存在
  • 檢查賬戶是否存在足夠的資金
  • A賬戶 - 資金
  • B賬戶 + 資金

表名為:bank:完成zhangsanlisi轉(zhuǎn)賬100元

id money
zhangsan 110
lisi 10
# 檢查賬戶
def check_account(self, account_id):
    cur =  self.con.cursor()
    sql = 'select * from bank WHERE id ="%s"' % (str(account_id))
    cur.execute(sql)
    if cur.rowcount == 1:
        print("%s existes."%(account_id))
    else:
        print("%s is wrong" % account_id)

# 檢查是否有足夠的錢
def check_money(self, values, account_id):
    cur = self.con.cursor()
    sql = 'select * from bank WHERE id="%s" AND money>%s' % (account_id, values)
    cur.execute(sql)
    print(cur.rowcount)
    if cur.rowcount == 1:
        print("Enough money!")
        return True
    else:
        print("No enough money!")
        return False
# 減款操作
def subtract(self, accout_id, tranfer_money, Flag):
    cur = self.con.cursor()
    if Flag:
        try:
            sql = 'update bank SET money = money - %s where id = "%s"' % (tranfer_money, accout_id)
            cur.execute(sql)
            print(cur.rowcount)
            if cur.rowcount == 1:
                print(u"減款成功")
        finally:
            cur.close()
    else:
        print(u"操作不成功.")

#加款操作
def add(self, accout_id, tranfer_money, Flag):
    cur = self.con.cursor()
    if Flag:
        try:
            sql = 'update bank SET money = money + %s WHERE id = "%s"' % (tranfer_money, accout_id)
            cur.execute(sql)
            print(cur.rowcount)
            if cur.rowcount ==1:
                print(u"加款成功")
        finally:
            cur.close()
    else:
        print(u"操作不成功.")

效果顯示:

005.png

執(zhí)行后:

006.png
zhangsan existes.
lisi existes.
Enough money!
減款成功
加款成功

第二次執(zhí)行的初始狀態(tài):

006.png

zhangsan existes.
lisi existes.
0
No enough money!
操作不成功.
操作不成功.

完整版代碼:完整代碼
數(shù)據(jù)庫(kù)的學(xué)習(xí)是為了完成爬蟲(chóng)數(shù)據(jù)的儲(chǔ)存。


6:參考及其說(shuō)明

參考列表:
01: 參考1
02: 參考2
03:參考:慕課網(wǎng)

Github:github

關(guān)于本人:

國(guó)內(nèi)小碩,半路出家的IT學(xué)習(xí)者。
興趣領(lǐng)域:爬蟲(chóng) , 數(shù)據(jù)科學(xué)
本人正在構(gòu)建一個(gè)共同成長(zhǎng)爬蟲(chóng)小型社群。有興趣私信。
文檔及代碼托管在Github上。

下期預(yù)告:爬取豆瓣電影,并存儲(chǔ)在數(shù)據(jù)庫(kù)中...(為啥都爬豆瓣來(lái)著)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容