前面ORM模块我们已经完成了开发

  还恐怕有登陆接口最尾部,更新管理员最后登陆时、登入ip和丰盛登四次数要求退换,具体代码如下:

  正文对应的源码下载

  当您习以为常这种写法以往,你会发觉实现各样接口会变得不行的总结与福利,开采速度比以前也进步了繁多

  产品分类有关接口(product_class.py)与产品有关接口(product.py)成效差不离,具体落实自小编就不一一解说了,咱们能够本人尝试

  一般的话,大家在支付时发掘ORM未有团结想要的艺术时,大家需求做以下思量:

  在编写时大家会发觉,大家的ORM并不曾直接判别记录是或不是留存的章程,独有贰个用以获取内定条件记录数的措施。

 

  如若是数值类型,直接写值就能够了,当然平昔赋字符串值也尚非亲非故系,因为生成sql是不会自动抬高单撇号的

  上边改变调用例子(请查看login.py第35行周边)

    def exists(self, wheres):
        """检查指定条件的记录是否存在"""
        return self.get_count(wheres) > 0

澳门太阳集团城网址,  通过这么些事例,我们在实际上开采进度中,能够灵活的依据本人须求,来充实或退换对应的平底方法,积存你协和的底层框架代码,那么随着开辟时间的加码,你付出起各样功效来就能够越加贯虱穿杨了。

  这段代码的需求是判定钦定的分类是不是被产品援引,抽象出来的意味正是判定钦点条件的笔录是或不是留存,对于那个意义有付出经历的同伙很轻易看清它是过多地方都有希望要用到的通用方法,所以大家要求在ORM中追加一下以此点子。而小编辈ORM已经存在get_count()那么些得到记录数的方法存在了,大家得以经过调用那几个措施来判定记录数据是不是大于0,来得出钦点条件的笔录是还是不是存在那样的结果。

  留神的爱人会发觉,ORM模块的缓存部分,多了三个get_model_澳门太陽城集团登录网址,for_cache_  前面ORM模块我们已经完成了开发。of_where()方法,上边小编来证可瑞康(Karicare)(Karicare)下它的用途。

 

  具体操作需求我们自个儿多debug,多测验使用才知道怎么选择到真实项目中。

  对于字段值,借使为字符串、具体时间、json等门类的,也正是说供给用单撇号括起来的,大家就供给调用string_helper模块的string方法开始展览转移,它可感到变量扩充单撇号,若是一贯赋字符串值,生成的sql语句是平素不单撇号的,这里要留心一下

  2.该效能是还是不是是常用的法力,能或无法封装成公共艺术,假使能够就将它包裹到逻辑层基类(ORM模块)中去,让具备继续的子类都享有这些效应

  有了这几个法子,大家就能够继续对产品分类删除接口进行改动了

  前面ORM模块我们已经完成了开发。  前面ORM模块我们已经完成了开发。python开荒QQ群:669058475   
笔者博客:

  1.有未有顶替能够兑现的艺术存在

  我们在支付时,除了通过主键id来博取记录实体以外,在有的数据表中,还或许会设有第二个主键,或多少个主键的情景,大家须要通过这几个主键来得到相应的记录实休,比方说管理员或用户表中的记名账号字段;订单表中的订单编码字段等。

 1 @delete('/api/product_class/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 实例化product表操作类ProductLogic
 7     _product_logic = product_logic.ProductLogic()
 8     # 判断该分类是否已经被引用,是的话不能直接删除
 9     if _product_logic.exists('product_class_id=' + str(id)):
10         return web_helper.return_msg(-1, "该分类已被引用,请清除对该分类的绑定后再来删除")
11 
12     # 实例化product_class表操作类product_class_logic
13     _product_class_logic = product_class_logic.ProductClassLogic()
14     result = _product_class_logic.delete_model(id)
15     # 判断是否提交成功
16     if result:
17         return web_helper.return_msg(0, '成功')
18     else:
19         return web_helper.return_msg(-1, "删除失败")
1 ##############################################################
2     ### 更新用户信息到数据库 ###
3     ##############################################################
4     # 更新当前管理员最后登录时间、Ip与登录次数(字段说明,请看数据字典)
5     sql = """update manager set last_login_time=%s, last_login_ip=%s, login_count=login_count+1 where id=%s"""
6     # 组合更新值
7     vars = ('now()', ip, manager_id,)
8     # 写入数据库
9     db_helper.write(sql, vars)
1     ##############################################################
2     ### 获取登录用户记录,并进行登录验证 ###
3     ##############################################################
4     _manager_logic = manager_logic.ManagerLogic()
5     # 从数据库中读取用户信息
6     manager_result = _manager_logic.get_model_for_cache_of_where('login_name=' + string(username))
7     # 判断用户记录是否存在
8     if not manager_result:
9         return web_helper.return_msg(-1, '账户不存在')

  前面ORM模块我们已经完成了开发。  这段代码后半部分能够参照产品的去除接口完成,前半有的供给调用产品艺术实行剖断管理。

  如若前方代码有认真读书的友人看到这段代码,要改成ORM格局应该很轻便实现了

  只供给将第7行到第10行替换对应的调用代码就足以了

1     ##############################################################
2     ### 获取登录用户记录,并进行登录验证 ###
3     ##############################################################
4     sql = """select * from manager where login_name='%s'""" % (username,)
5     # 从数据库中读取用户信息
6     manager_result = db_helper.read(sql)
7     # 判断用户记录是否存在
8     if not manager_result:
9         return web_helper.return_msg(-1, '账户不存在')
 1     ##############################################################
 2     ### 更新用户信息到数据库 ###
 3     ##############################################################
 4     # 更新当前管理员最后登录时间、Ip与登录次数(字段说明,请看数据字典)
 5     fields = {
 6         'last_login_time': 'now()',
 7         'last_login_ip': string(ip),
 8         'login_count': 'login_count+1',
 9     }
10     # 写入数据库
11     _manager_logic.edit_model(manager_id, fields)

版权评释:本文原创发布于 博客园,作者为 AllEmpty 本文接待转发,但未经笔者同意必须保留此段表明,且在小说页面显然地方给出原来的书文连接,不然便是侵犯权益。

 1 @delete('/api/product_class/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 判断该分类是否已经被引用,是的话不能直接删除
 7     sql = """select count(*) as total from product where product_class_id=%s""" % (id,)
 8     # 读取记录
 9     result = db_helper.read(sql)
10     if result and result[0].get('total', -1) > 0:
11         return web_helper.return_msg(-1, "该分类已被引用,请清除对该分类的绑定后再来删除")
12 
13     # 编辑记录
14     sql = """delete from product_class where id=%s returning id"""
15     vars = (id,)
16     # 写入数据库
17     result = db_helper.write(sql, vars)
18     # 判断是否提交成功
19     if result:
20         return web_helper.return_msg(0, '成功')
21     else:
22         return web_helper.return_msg(-1, "删除失败")

 

 1 @delete('/api/product/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 编辑记录
 7     sql = """delete from product where id=%s returning id"""
 8     vars = (id,)
 9     # 写入数据库
10     result = db_helper.write(sql, vars)
11     # 判断是否提交成功
12     if result:
13         return web_helper.return_msg(0, '成功')
14     else:
15         return web_helper.return_msg(-1, "删除失败")
 1     def get_model_for_cache_of_where(self, where):
 2         """
 3         通过条件获取记录实体————条件必须是额外的主键,也就是说记录是唯一的(我们经常需要使用key、编码或指定条件来获取记录,这时可以通过当前方法来获取)
 4         :param where: 查询条件
 5         :return: 记录实体
 6         """
 7         # 生成实体缓存key
 8         model_cache_key = self.__table_name + encrypt_helper.md5(where)
 9         # 通过条件从缓存中获取记录id
10         pk = cache_helper.get(model_cache_key)
11         # 如果主键id存在,则直接从缓存中读取记录
12         if pk:
13             return self.get_model_for_cache(pk)
14 
15         # 否则从数据库中获取
16         result = self.get_model(where)
17         if result:
18             # 存储条件对应的主键id值到缓存中
19             cache_helper.set(model_cache_key, result.get(self.__pk_name))
20             # 存储记录实体到缓存中
21             self.set_model_for_cache(result.get(self.__pk_name), result)
22             return result

 

  我们能够改换为:

  产品分类的删减分类接口我们拜望到它的代码与制品删除接口大约,不过多了三个该分类是还是不是曾经被引述的一个判别,对于这么些上面特意求证一下

  经常状态下,大家直接通过get_model()方法就能够读取对应的笔录了,假若我们想减掉数据库的询问,直接在缓存中怎么样利用呢?间接存取记录实体,由于这么些额外的主键并不曾与ORM中的编辑与删除操作关联,即在拓展编写制定与删除操作时不会共同更新用别样主键存款和储蓄的实行业内部容,那样就可以发出脏数据。所以我们得以换一种思路来促成,我们得以将那个额外的主键和呼应的值生成缓存组合key,里面积存对应的笔录实体id,也等于说在积存记录实体时,照旧利用原本的主键id存款和储蓄该实体,然后用额外主键和对应值生成缓存组合key中蕴藏主键id,在取得记录实体时,先用这些组成key提取对应的id,再用那么些id来赢得记录实体。那么些阐明好像有一点点绕,大家本身debug一下就很轻巧精通个中的规律了,上边看代码:

  假诺要赋postgresql系统变量,如now(),直接像上边那样写就能够了

 

 1 @delete('/api/product/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 实例化product表操作类ProductLogic
 7     _product_logic = product_logic.ProductLogic()
 8     result = _product_logic.delete_model(id)
 9     # 判断是否提交成功
10     if result:
11         return web_helper.return_msg(0, '成功')
12     else:
13         return web_helper.return_msg(-1, "删除失败")

  大家能够改换为:

 

  在写ORM模块时,大家早就对产品接口的分页查询、新增添、修改、获取内定产品实业接口已经重构好了,还余下删除接口未到位

  首先是伊始化产品逻辑层操作类,然后调用delete_model()这些艺术就足以了

  即使字段是数值型,要让它进行测算,间接像上边那样写也行,能够是四个字段用加号连起来。当然你也得以将字段时读出来进行测算后再赋值提交也绝非难题

  后面ORM模块我们曾经完毕了支出,接下去要做的正是对品种代码举行重构了。因为对底层数据库操作模块(db_helper.py)举办了改造,在此之前项指标接口代码全都跑不起来了。

  3.要是它只是对点名表单操作时才用到,就将它包裹到该逻辑层子类,方便该子类要用到时得以天天调用

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图