如果没有使用数据库查询获取结果,如何收到错误?

Phi*_*hil 2 python mysql sqlalchemy pyramid

我正在尝试用SQLAlchemy学习和进步.今天我想了解它引发的例外情况.

我正在开发基于金字塔的项目,MySQL服务器(InnoDB)和SQLAlchemy.

我试图除了所有错误,因为NoResultFound错误不会在控制台中引发或打印.所以我除外exc.SQLAlchemyError.

当我查询我的表并且没有找到结果时,它不会引发或捕获或除了任何其他任何内容并继续运行.

问题:

  1. 我该如何以及如何查询.all().one()处理没有返回任何行的问题?
  2. 我该如何以及如何处理其他SQL或系统相关的错误?我想记录它们并观察它们以解决问题.

我的代码是:

try:
    query = Session.query(MyTable).filter(Terms.column == my_string).all()
except exc.SQLAlchemyError, e:
    print e
    return False
Run Code Online (Sandbox Code Playgroud)

(而不是exc.SQLAlchemyError,我首先尝试过NoResultFound,e)

Jas*_*sch 7

实际上,如果没有找到记录,此代码不会引发异常.所以你应该抛出自己的异常:

import logging
try:
    records = Session.query(MyTable).\
        filter(Terms.column == my_string).all()
    if len(records) == 0:
        raise MyException('No records found')
except MyException, e:
    logging.info('No records found')
except exc.SQLAlchemyError, e:
    logging.exception('Some problem occurred')
Run Code Online (Sandbox Code Playgroud)

  • 使用`.one()`而不是`.all()`时会引发`NoResultFound`.传统上,当您要求所有内容时,数据库不会认为返回空集是错误的.SQLAlchemy会帮助您,并告诉您存在问题,但是当您要求特定的一条记录时. (4认同)
  • query.all()返回一个Python列表; 在那个阶段,没有count()方法.另外,如果您想说query.count(),我还建议不要调用**count()和all() - 两者都发出一个SQL语句.如果你已经调用all()并得到一个空列表(即mylist = query.all()),只需检查该列表是否为非空:"if not mylist:raise ...". (4认同)
  • Jasper,已经过了几天,但我想说一下你的代码和解释有多大帮助.非常感谢. (2认同)