在写获取用户操作记录的时候发现,插入用户操作时有点问题,因为主键的选择并不能完全区分每一条操作,就算是加上每次的日期也不行,所以我就干脆使用时间戳来作为主键,也就是交易流水,这样插入的功能总算完成了。
因为前面的先存进去的 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
完成之后,接下来就是查找方法了,因为每个人有多条记录,所以我写了两个方法,一个是获取相关用户的所有记录,还有一个是获取当前的用户的最近的一条操作。当然后面可能把这个改成获取任意条,取决于用户的输入。
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
输出结果:
因为ATM的相关功能还没有实现,所以记录是我手打的,而且用户的余额没有改变。
这里写完了获取所有的,然后就是获取一条的了。......突然想到两个可以合二为一,变为一个函数。。
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上使用时是不会再短时间内重复请求两次的,时间戳也不会这近,但是使用时间戳作为主码还是有点牵强。。。
先这样吧,接下来是获取一条最近操作记录的方法,我照前面写了一个,。。。。但是获取的是最早的交易记录。。。。
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花了一点点时间,把它实现了。
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 语句的使用还不是很熟练以后还得多用用。
我先个想法就是,自己做一个网页的电子书下载器,还有一个图书馆管理系统,用来作为以后找工作的项目。这个ATM是我第一个做的这种管理系统的项目。很小用来熟悉下。。。
。。。EMMMMM凉了,写着写着,前面的插入新的用户,也就是用户注册的方法 不好用了,报错
新用户注册失败
(1136, "Column count doesn't match value count at row 1")
这个在网上找的原因:
咱也不知道,咱也不知道上哪问?
哇, 经过一个下个下午的查找,终于看见了,我把一个逗号写错了,写成了一个点。
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
也不知道自己什么时候打错了。。。。
真难受
下面我在来测试下改用户信息的是否可以用,不然后面协议班了还要回来改代码就很闹心了。
def update_user(self, change_item: str, change_value: str)
好了。。。。这下凉了,这个方法也出了问题。
(1054, "Unknown column 'XX' in 'field list'")
我在改用户姓名时又出现了这样的问题。看样子是语法sql语法的问题。后来经过一番查找加看书,终于找到了问题。
我发现,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语句是用“+”号链接的,所以就忽略了值上的引号,前面出现过同样的问题,是在插入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
关于用户的增删改查,方法都齐全了。
接下来的就是关于日志的记录了,
这里我想分为两个部分,一个部分是记录用户的操作记录,还有一个是系统的使用记录,记录在log.txt这样的文件里面的,而不是放在数据库中,目前我只写了操作记录的增删查,并未写改方法,因为一开始我觉得改操作记录是不是不太符合正常的使用习惯,但是刚才写更改用户操作记录的时候,我又突然想到,如果一个用户突然改名了呢?那他改之前的记录和改之后的记录怎么分,后来一想,不改也行,因为我不是拿人名作为主键的,而是拿用户的卡号,一个用户的卡号是不可以改变的,这应该算是一种常识了吧。。。所以也就没有然后了。
def insert_log(self, item: Item)
这里我之前好像讲过还是提到过来着,功能是好用 的,主要就是一个主键的选择问题,我了解了下银行流水的问题,但是我目前还没有打算给他整一个流水号的问题,还是用之前的时间戳作为主键,毕竟两个统一时间的操作似乎很难发生。。。这里就不做更改。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
关于log的相关操作这里就不多说了。之前就已经测试过了,
正是那句话,亲测好使!……