在寫獲取用戶操作記錄的時候發(fā)現(xiàn)轧铁,插入用戶操作時有點問題珍德,因為主鍵的選擇并不能完全區(qū)分每一條操作蚤告,就算是加上每次的日期也不行努酸,所以我就干脆使用時間戳來作為主鍵,也就是交易流水杜恰,這樣插入的功能總算完成了获诈。
因為前面的先存進去的 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é)果:
因為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 又涼了居兆,覆山,因為就算用時間戳,相近的兩條記錄的時間是一模一樣的泥栖,
這是真難受魏割,我因該要拿什么東西做主鍵呢?钢颂?钞它??
不過刪除的方法是真好用:
一下子就全部沒了
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)的項目。很小用來熟悉下尸饺。进统。。
浪听。螟碎。。EMMMMM涼了迹栓,寫著寫著掉分,前面的插入新的用戶,也就是用戶注冊的方法 不好用了,報錯
新用戶注冊失敗
(1136, "Column count doesn't match value count at row 1")
這個在網(wǎng)上找的原因:
咱也不知道酥郭,咱也不知道上哪問华坦?
哇, 經(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)測試過了,
正是那句話读规,親測好使抓督!……