day_2 完善DBHelper

在寫獲取用戶操作記錄的時候發(fā)現(xiàn)轧铁,插入用戶操作時有點問題珍德,因為主鍵的選擇并不能完全區(qū)分每一條操作蚤告,就算是加上每次的日期也不行努酸,所以我就干脆使用時間戳來作為主鍵,也就是交易流水杜恰,這樣插入的功能總算完成了获诈。

image.png
image.png

因為前面的先存進去的 second 鍵沒有值,我就直接改了心褐。

    def insert_log(self, item: Item):
        """新加一條記錄"""
        number = item.get_user().get_number()
        time = item.get_time()
        second = item.get_second()
        name = item.get_user().get_name()
        type = item.get_type()
        money = item.get_money()
        status = item.get_status()
        balance = item.get_user().get_balance()
        sql = "INSERT INTO log (second, number, time, name, type, money, " \
              "status, " \
              "balance)" \
              "VALUES('%f', '%s', '%s', '%s','%s', '%f', '%s', '%f')" \
              % (second, number, time, name, type, money, status, balance)
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print("日志記錄失敗")
            print(e.args)
            self.connect.rollback()
            return False
        return True

item 類

也新加了一個second屬性

    def __init__(self, user, type, money, status):
        self._time = str(datetime.now())
        self._second = time.time()
        self._user = user
        self._type = type
        self._money = money
        self._status = status

填上了的公共的獲取方法

    def get_second(self):
        return self._second

完成之后烙荷,接下來就是查找方法了,因為每個人有多條記錄檬寂,所以我寫了兩個方法,一個是獲取相關(guān)用戶的所有記錄戳表,還有一個是獲取當前的用戶的最近的一條操作桶至。當然后面可能把這個改成獲取任意條,取決于用戶的輸入匾旭。

    def get_all_logs(self, number):
        """獲取一個用戶的所有操作記錄"""
        sql = "SELECT * FROM log WHERE number=" + number
        result = None
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            result = self.cursor.fetchall()
        except Exception as e:
            print("獲取用戶操作記錄失敗")
            print(e.args)
        return result

輸出結(jié)果:

結(jié)果

因為ATM的相關(guān)功能還沒有實現(xiàn)镣屹,所以記錄是我手打的,而且用戶的余額沒有改變价涝。

這里寫完了獲取所有的女蜈,然后就是獲取一條的了。......突然想到兩個可以合二為一色瘩,變?yōu)橐粋€函數(shù)伪窖。。

    def get_one_log(self, number):
        """獲取一個用戶最近的一條操作記錄"""
        sql = "SELECT * FROM log WHERE number=" + number
        result = None
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            result = self.cursor.fetchone()
        except Exception as e:
            print("獲取用戶操作記錄失敗")
            print(e.args)
        return result

emmmmmm 又涼了居兆,覆山,因為就算用時間戳,相近的兩條記錄的時間是一模一樣的泥栖,

簇宽。。吧享。

這是真難受魏割,我因該要拿什么東西做主鍵呢?钢颂?钞它??

不過刪除的方法是真好用:

nnn

一下子就全部沒了

    def del_all_logs(self, number):
        """刪除用戶的所有記錄,僅用于銷戶"""
        sql = "DELETE FROM lOG WHERE number=" + number
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print("刪除用戶操作記錄失敗")
            self.connect.rollback()
            print(e.args)
            return False
        return True

db = DBHelper()
db.del_all_logs("144050")

须揣。盐股。。事實上我在后面寫的web上使用時是不會再短時間內(nèi)重復請求兩次的耻卡,時間戳也不會這近疯汁,但是使用時間戳作為主碼還是有點牽強。卵酪。幌蚊。

先這樣吧,接下來是獲取一條最近操作記錄的方法溃卡,我照前面寫了一個溢豆,。瘸羡。漩仙。。但是獲取的是最早的交易記錄犹赖。队他。。峻村。

    def get_one_log(self, number):
        """獲取一個用戶最近的一條操作記錄"""
        sql = "SELECT * FROM log WHERE number=" + number
        result = None
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            result = self.cursor.fetchone()
        except Exception as e:
            print("獲取用戶操作記錄失敗")
            print(e.args)
        return result

Mysql 語句怎么整麸折。。粘昨。

emmm花了一點點時間垢啼,把它實現(xiàn)了。

 def get_one_log(self, number):
        """獲取一個用戶最近的一條操作記錄"""
        sql = "SELECT * FROM log WHERE second=(SELECT  max(second) FROM log " \
              "WHERE number=%s)" % number
        result = None
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            result = self.cursor.fetchone()
        except Exception as e:
            print("獲取用戶操作記錄失敗")
            print(e.args)
        return result

mysql 語句的使用還不是很熟練以后還得多用用张肾。

我先個想法就是芭析,自己做一個網(wǎng)頁的電子書下載器,還有一個圖書館管理系統(tǒng)捌浩,用來作為以后找工作的項目放刨。這個ATM是我第一個做的這種管理系統(tǒng)的項目。很小用來熟悉下尸饺。进统。。

image.png

浪听。螟碎。。EMMMMM涼了迹栓,寫著寫著掉分,前面的插入新的用戶,也就是用戶注冊的方法 不好用了,報錯

新用戶注冊失敗
(1136, "Column count doesn't match value count at row 1")

這個在網(wǎng)上找的原因:


image.png

咱也不知道酥郭,咱也不知道上哪問华坦?

哇, 經(jīng)過一個下個下午的查找不从,終于看見了惜姐,我把一個逗號寫錯了,寫成了一個點椿息。

     def insert_user(self, user: User):
        """新加一個用戶歹袁,注冊新的用戶"""
        number = user.get_number() 
        name = user.get_name() 
        password = user.get_password() 
        balance = user.get_balance() 
        # print(number, name, password, balance) #
        self.connect.ping(reconnect=True)
        sql = "INSERT INTO user (number, name, password, balance)" \
              "VALUES('%s', '%s', '%s', '%f')" % (number, name, password,
                                                 balance)
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print("新用戶注冊失敗")
            print(e.args)
            self.connect.rollback()
            return False
        return True

也不知道自己什么時候打錯了。寝优。条舔。。
真難受

下面我在來測試下改用戶信息的是否可以用乏矾,不然后面協(xié)議班了還要回來改代碼就很鬧心了孟抗。

def update_user(self, change_item: str, change_value: str)

好了。钻心。夸浅。。這下涼了扔役,這個方法也出了問題。

(1054, "Unknown column 'XX' in 'field list'")我在改用戶姓名時又出現(xiàn)了這樣的問題警医∫谛兀看樣子是語法sql語法的問題。后來經(jīng)過一番查找加看書预皇,終于找到了問題侈玄。

我發(fā)現(xiàn),sql語句中用來表示鍵的值得時候吟温,需要加上——‘’ 這個東西序仙,如果不加,他就不認為這是個值鲁豪,無論是什么樣的類型潘悼。都需要加。不然就會一直回滾爬橡,一直出錯治唤。。糙申。宾添。。

開始的的代碼是這樣子的

    def update_user(self, user: User, change_item: str, change_value: str):
        """改"""
        sql = "UPDATE user SET " + change_item + "=" +   change_value + \
                "WHERE number=" + user.get_number()
        print(sql)
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print("用戶信息更改失敗")
            print(e.args)
            self.connect.rollback()
            return False
        return True

我的sql語句是用“+”號鏈接的,所以就忽略了值上的引號缕陕,前面出現(xiàn)過同樣的問題粱锐,是在插入item log的時候出的問題。VALUES里的值應該用單引號括起來扛邑。就像下面這個樣子怜浅。
"VALUES('%f', '%s', '%s', '%s','%s', '%f', '%s', '%f')"

后來改過了是這樣的:

    def update_user(self, user: User, change_item: str, change_value: str):
        """改"""
        sql = "UPDATE user SET " + change_item + "='" + change_value + \
              "' WHERE number='456789'"
        print(sql)
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print("用戶信息更改失敗")
            print(e.args)
            self.connect.rollback()
            return False
        return True

這下子就好使了。

接下來是刪除用戶鹿榜,也就是注銷額時候海雪。

哎呀,這次一步到位了呢舱殿,真舒服:

    def del_user(self, number: str):
        """刪"""
        sql = " DELETE FROM user WHERE number=%s" % number
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print("用戶銷戶失敗")
            print(e.args)
            self.connect.rollback()
            return False
        return True

關(guān)于用戶的增刪改查奥裸,方法都齊全了。


接下來的就是關(guān)于日志的記錄了沪袭,

這里我想分為兩個部分湾宙,一個部分是記錄用戶的操作記錄,還有一個是系統(tǒng)的使用記錄冈绊,記錄在log.txt這樣的文件里面的侠鳄,而不是放在數(shù)據(jù)庫中,目前我只寫了操作記錄的增刪查死宣,并未寫改方法伟恶,因為一開始我覺得改操作記錄是不是不太符合正常的使用習慣,但是剛才寫更改用戶操作記錄的時候毅该,我又突然想到博秫,如果一個用戶突然改名了呢?那他改之前的記錄和改之后的記錄怎么分眶掌,后來一想挡育,不改也行,因為我不是拿人名作為主鍵的朴爬,而是拿用戶的卡號即寒,一個用戶的卡號是不可以改變的,這應該算是一種常識了吧召噩。母赵。。所以也就沒有然后了具滴。

def insert_log(self, item: Item)

這里我之前好像講過還是提到過來著市咽,功能是好用 的,主要就是一個主鍵的選擇問題抵蚊,我了解了下銀行流水的問題施绎,但是我目前還沒有打算給他整一個流水號的問題溯革,還是用之前的時間戳作為主鍵,畢竟兩個統(tǒng)一時間的操作似乎很難發(fā)生谷醉。致稀。。這里就不做更改俱尼。emmmm抖单。。似乎每一個寫東西的人都很喜歡挖坑遇八,然后忘記這個坑矛绘,以后也不管填不填,江南大大寫的書就是刃永,挖了賊多坑货矮,也不知道填上了幾個。

這里先不管他了斯够,反正好使就完事了:

    def insert_log(self, item: Item):
        """新加一條記錄"""
        number = item.get_user().get_number()
        time = item.get_time()
        second = item.get_second()
        name = item.get_user().get_name()
        type = item.get_type()
        money = item.get_money()
        status = item.get_status()
        balance = item.get_user().get_balance()
        sql = "INSERT INTO log (second, number, time, name, type, money, " \
              "status, balance)" \
              "VALUES('%f', '%s', '%s', '%s','%s', '%f', '%s', '%f')" \
              % (second, number, time, name, type, money, status, balance)
        try:
            self.connect.begin()
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print("日志記錄失敗")
            print(e.args)
            self.connect.rollback()
            return False
        return True

關(guān)于log的相關(guān)操作這里就不多說了囚玫。之前就已經(jīng)測試過了,

正是那句話读规,親測好使抓督!……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市束亏,隨后出現(xiàn)的幾起案子铃在,更是在濱河造成了極大的恐慌,老刑警劉巖碍遍,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌穆,死亡現(xiàn)場離奇詭異,居然都是意外死亡雀久,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門趁舀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赖捌,“玉大人,你說我怎么就攤上這事矮烹≡奖樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵奉狈,是天一觀的道長卤唉。 經(jīng)常有香客問我,道長仁期,這世上最難降的妖魔是什么桑驱? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任竭恬,我火速辦了婚禮,結(jié)果婚禮上熬的,老公的妹妹穿的比我還像新娘痊硕。我一直安慰自己,他們只是感情好押框,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布岔绸。 她就那樣靜靜地躺著,像睡著了一般橡伞。 火紅的嫁衣襯著肌膚如雪盒揉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天兑徘,我揣著相機與錄音刚盈,去河邊找鬼。 笑死道媚,一個胖子當著我的面吹牛扁掸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播最域,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼谴分,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镀脂?” 一聲冷哼從身側(cè)響起牺蹄,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄翅,沒想到半個月后沙兰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翘魄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年鼎天,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暑竟。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡斋射,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出但荤,到底是詐尸還是另有隱情罗岖,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布腹躁,位于F島的核電站桑包,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纺非。R本人自食惡果不足惜哑了,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一赘方、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垒手,春花似錦蒜焊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榜掌,卻和暖如春优妙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憎账。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工套硼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胞皱。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓邪意,卻偏偏與公主長得像,于是被迫代替她去往敵國和親反砌。 傳聞我的和親對象是個殘疾皇子雾鬼,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容