1.排除法

在写代码的时候,我们经常会遇到这种情况,就是代码逻辑本身比较复杂,然后呢debug过程中还发现了一些很诡异的错误,比如如下python代码,其中Class 是班级对象,而 Student是学生对象,他们是一对多关系:

1.1.对象信息

class Class(Base):__tablename__ = 't_class'id = Column(INTEGER, primary_key=True, autoincrement=True)name = Column(String(32))def __init__(self, id=None, name=None):self.id = idself.name = nameclass Student(Base):__tablename__ = 't_student'id = Column(INTEGER, primary_key=True, autoincrement=True)name = Column(String(32))c_id = Column('c_id', INTEGER)def __init__(self, id=None, name=None, c_id=c_id):self.id = idself.name = nameself.c_id = c_id

2.获取数据库连接

class DBManager(object):@staticmethoddef get_session():# postgresqls# engine = create_engine('postgresql://postgres:123456@10.74.12.202:5432/test', echo=True)# mysqlengine = create_engine('mysql+mysqlconnector://root:123456@10.74.12.202:3306/test',echo=False, encoding="utf-8", max_overflow=30, pool_size=10)DBsession = sessionmaker(bind=engine)# 初始化表return DBsession()

3.数据库信息


4.正常查询语句和结果

5.使用sqlalchemy查询语句
正常查询

def combine_query():"""联合查询:return:"""session = DBManager.get_session()query = session.query(Student.id, Student.name, Class.name).filter(Student.c_id == Class.id)rows = query.all()for row in rows:print row[0], row[1], row[2]

添加条件查询:添加 in 查询

def combine_query():"""联合查询:return:"""session = DBManager.get_session()query = session.query(Student.id, Student.name, Class.name).filter(Student.c_id == Class.id)ids = []query = query.filter(Student.id.in_(ids))rows = query.all()for row in rows:print row[0], row[1], row[2]

这个查询被 sqlalchemy 编译后的结果如下:

SELECT t_student.id AS t_student_id, t_student.name AS t_student_name, t_class.name AS t_class_name
FROM t_student, t_class
WHERE t_student.c_id = t_class.id AND t_student.id != t_student.id

注意where条件这一块多了如下的内容 AND t_student.id != t_student.id,这个很明显是有问题的,所以导致查询出错,因为这个查询很简单,所以如果多看看可能就把问题解决了。

但是如果这是一个非常复杂的查询,里面掺杂了各种查询条件,这个时候估计再来分析可能难度就会变得非常大,怎么办呢?比如如果代码如下:

def combine_query():"""联合查询:return:"""session = DBManager.get_session()query = session.query(Student.id, Student.name, Class.name).filter(Student.c_id == Class.id)ids = []query = query.filter(Student.name.like('小明'))query = query.filter(Student.c_id > 10)query = query.filter(Student.id.in_(ids))rows = query.all()for row in rows:print row[0], row[1], row[2]

这个时候,代码还是很简单,我们可以想象如果条件不是几个,而是几十个怎么办呢?对于这种复杂的问题,诡异的问题,不要去分析逻辑,那样太耗时了,直接使用排除法来解决,就是把所有条件都先删除掉,然后逐个添加条件,当添加某个条件后出现诡异问题了,那就说明问题就出现在这个条件上,然后就定位到问题了,解决的办法也就来了,这样的效率要比分析的效率高很多,因为掺杂逻辑的关联可能让分析变得非常麻烦和复杂,这种排除法反而简单而且容易分析。
对应上面这个问题,只要我们一个条件一个条件的添加,会发现出现AND t_student.id != t_student.id的时候是在添加: query = query.filter(Student.id.in_(ids)) 条件的时候,所以就知道是因为 ids 是空的时候会出现这种问题,于是我们就可以通过判断来决定是不是要添加这个条件了,我们可以修改如下。

def combine_query():"""联合查询:return:"""session = DBManager.get_session()query = session.query(Student.id, Student.name, Class.name).filter(Student.c_id == Class.id)ids = []query = query.filter(Student.name.like('小明'))query = query.filter(Student.c_id > 0)query = query.filter(Student.id.in_(ids) if ids else '')rows = query.all()for row in rows:print row[0], row[1], row[2]

如上可知道,我们使用的框架本身可能存在一些问题,这个时候如果我们正好碰上了,我们可能会感觉很受挫,这个时候,与其通过所谓的理性去查找问题,不如通过排除法来快速定位和解决问题,这会让我们解决问题的效率有很大提升

解决复杂问题的思路-排除法相关推荐

  1. 服务端解决故障的处理思路

    简单记录一下解决服务器故障的思路,以便今后迅速定位问题. Java服务端 1.出错一般来说是两种情况: (1)代码逻辑出错了 (2)传入参数出错了 2.在上述情况都正确的情况下,那么业务逻辑可能是正常 ...

  2. 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路

    今天代码写着写着就莫名闪退了,手机也没有"程序停止运行"的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现.复现几次之后,终于从logcat中看到了一 ...

  3. idea里的包移不动_IDEA 半天卡住buid(编译)不动——解决办法及定位思路

    [号外号外!] 最终解决办法并不复杂,关键在于"遇见问题,怎么样层层分析,多条路径试错,最终解决问题的思路或者能力"--资深码农的核心竞争力之一 背景 今天结束完最近2个月的一个项 ...

  4. 解决数学题的编程思路

    一.解决方程 用二分法即可求解. 二.解决公倍数 比如三个数11,12,13,求其公倍数,则思路如下: 定义一个变量j,赋值为1,然后分别对11,12,13进行求余(j是被除数),若三者的余有任一个不 ...

  5. 详解python框架django为例,还没开始写代码前的花式坑——解决办法和排错思路。pycharm解释器配置,虚拟环境venv配置,使用命令行。

    如果你现在赶项目,就直接跳到符合的标题查看解决办法.如果你对理论思考不太感冒,也可以直接跳到指定标题. 如果你是学习者,极客,时间充足,希望你能够耐心的看下去,因为你在这里,不仅仅可以找到解决办法,更 ...

  6. 解决开发问题的思路与心态

    开发遇到问题时不要慌,所有的问题都有其产生的原因,找到原因再对症下药,保准药到病除. 开发工作中,我会遇到一些同事,遇到问题后不去分析问题产生的原因,先是自己猜测,试着乱改. 发现自己不能解决后,网上 ...

  7. oracle 尚未从池中获取连接,解决一个问题的思路 之“解决已经写满con.close() 仍然出现但是尚未从池中获取连接的连接池耗尽问题”...

    这篇文章主要写解决一个网上答案不能解决自己问题的时候,解决问题的整个流程, 如果大家觉得这个没价值,还请管理员帮忙撤销发首页 先谢谢各位了. 一年前帮学校做了一个就业信息管理系统, 当时图热闹,觉得虽 ...

  8. 剑指Offer学习笔记(3)——解决面试题的思路

    容易实现的算不上梦想,轻易放弃的算不上诺言. 要想成功得敢于挑战,有了梦想才有美好的明天! 前言:面试的时候我们经常遇到难题,画图.举例子和分解能够很好的帮助我们解决问题和细化问题. 一.画图使得抽象 ...

  9. 解决复杂问题的思路 —— 从简单到复杂

    1. 九个人猜九顶帽子 8 个人围成一圈,有一个处在圈心,每个人都事先蒙上眼,然后带上帽子(5黑,4白,随机分配).把圈上人的眼罩都摘下之后(中心的人不摘),圈上人都只能看到其余 7 个人的帽子颜色. ...

最新文章

  1. 自动化测试,从入门到放弃
  2. 移动通信学习笔记_01概述
  3. Asterisk标准通道变量
  4. 局域网打印机反应慢_为什么你的Excel这么慢,这些原因必须要知道!
  5. FusionCharts破解版导出图片步骤
  6. python1到100偶数求和_python1-100怎样偶数求和?_后端开发
  7. 复习-java运行的整个流程
  8. 手把手写一个vue3的组件
  9. filter和sessionListener实现session超时退出功能,过滤掉轮询请求
  10. UML 类图画法规则
  11. Linux 下实现ssh无密码登陆
  12. 通过bootstrap4框架制作商城网页
  13. 研究生必备的文献翻译软件知云文献翻译替代品--Mac monterey
  14. 扩增子图表解读4曼哈顿图:差异OTU或Taxonomy
  15. ug585-Zynq-7000中文文档阅读笔记
  16. Charles 限制网络速度(Throttle设置)
  17. nodejs中生成uuid
  18. ViewPager + TextView 小说阅读器分页
  19. 和尚吃馒头c语言程序,(八十一)约瑟夫环/鲁智深吃馒头
  20. 盛邦安全网站监控预警平台化繁为简 ——网站安全从管理向治理的迁移

热门文章

  1. 人体骨骼关键点检测的算法
  2. win10蓝牙允许设备连接到此计算机,win10系统配置蓝牙时“允许Bluetooth设备连接到此计算机”选项灰色的图文步骤...
  3. C语言中图形函数及其用法
  4. 大数据常见术语,你了解多少?
  5. win7怎么开启文件共享
  6. React新生命周期--getDerivedStateFromProps、getSnapshotBeforeUpdate
  7. hbuilder项目,直接调试真机运行可以,打包后安装在手机上就不行了,
  8. java获取秒时间_关于java:以秒为单位获取当前时间
  9. 华为2016校招 机试题
  10. 深度解析推荐系统的算法原理