day_2 完善DBHelper

在写获取用户操作记录的时候发现,插入用户操作时有点问题,因为主键的选择并不能完全区分每一条操作,就算是加上每次的日期也不行,所以我就干脆使用时间戳来作为主键,也就是交易流水,这样插入的功能总算完成了。

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

完成之后,接下来就是查找方法了,因为每个人有多条记录,所以我写了两个方法,一个是获取相关用户的所有记录,还有一个是获取当前的用户的最近的一条操作。当然后面可能把这个改成获取任意条,取决于用户的输入。

    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 又凉了,,因为就算用时间戳,相近的两条记录的时间是一模一样的,

。。。

这是真难受,我因该要拿什么东西做主键呢????

不过删除的方法是真好用:

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上使用时是不会再短时间内重复请求两次的,时间戳也不会这近,但是使用时间戳作为主码还是有点牵强。。。

先这样吧,接下来是获取一条最近操作记录的方法,我照前面写了一个,。。。。但是获取的是最早的交易记录。。。。

    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是我第一个做的这种管理系统的项目。很小用来熟悉下。。。

image.png

。。。EMMMMM凉了,写着写着,前面的插入新的用户,也就是用户注册的方法 不好用了,报错

新用户注册失败
(1136, "Column count doesn't match value count at row 1")

这个在网上找的原因:


image.png

咱也不知道,咱也不知道上哪问?

哇, 经过一个下个下午的查找,终于看见了,我把一个逗号写错了,写成了一个点。

     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的相关操作这里就不多说了。之前就已经测试过了,

正是那句话,亲测好使!……

你可能感兴趣的:(day_2 完善DBHelper)