【问题标题】:python cursor.execute returning emptypython cursor.execute返回空
【发布时间】:2017-05-19 10:34:50
【问题描述】:

我想用于 REST API 服务器的 python 代码有问题。

当前的问题是当我知道该值存在时,我的数据库查询返回 null

具体路径的代码:

@app.route('/data/active_predicted/<int:ticketId>', methods=['GET'])
def search_db_tickId_act(ticketId):
    cursor = db.cursor()
    db_query = cursor.execute("select * from active_predicted where ticketId=" + str(ticketId))
    json_output = json.dumps(dict(cursor.fetchall()))
    cursor.close()
    if not cursor.fetchall():
        return "Nothing found \n SQL Query: " + "select * from active_predicted where ticketId=" + str(ticketId)
    else:
        return str(cursor.fetchall())

当我访问此 URL 时,我会返回以下内容:

Nothing found SQL Query: select * from active_predicted where ticketId=1324

当我插入这个 SQL 查询时,我得到了我想要的结果,1 行 2 列,但似乎程序无法找到该行?

【问题讨论】:

  • 我猜你正在使用 json_output = json.dumps(dict(cursor.fetchall())) 行中的所有结果,但我不是 Python 数据库专家。我还建议您可能不想使用字符串操作来构造查询(DB 接口有自己更安全的指定参数的方式)。
  • 首先,不要通过字符串连接来构造查询,你的程序很容易受到sql注入的攻击。游标的命名也是有原因的——它在结果集中向前推进,所以你不能一直重复调用“fetchall”——第一个 fetchall 会获取所有结果。
  • @pvg 谢谢你的提示,我习惯了java编程,所以我不太确定这些功能。另外,感谢您提供有关 SQL 注入的提示。问题是即使底部没有 if else 语句,返回的 JSON 对象内部仍然没有任何数据。
  • fetchall 返回一个列表,我认为您不能将该结果传递给dict()。您期望的理想结果是什么?
  • @Jimmy np,您可能需要阅读 python db api(无论您使用什么驱动程序都可以实现它)。 cursor 和prepared statements 的基本概念与JDBC非常相似

标签: python mysql-python


【解决方案1】:

问题:

  1. 正如@pvg 提到的,您需要在查询数据库时转义输入值;
  2. 如果要获取类似字典的结果,请在初始化游标时传递dictionary=True
  3. 在您的原始代码中,您没有返回变量json_output
  4. 要仅获取一个结果,请使用fetchone 而不是fetchall
  5. cursor.close() 被调用后,无论之前是否获取,都无法从该游标中获取任何信息;
  6. 使用 try-finally 确保游标始终关闭(最终)。

这里是固定代码:

@app.route('/data/active_predicted/<int:ticketId>', methods=['GET'])
def search_db_tickId_act(ticketId):
    try:
        cursor = db.cursor(dictionary=True)
        db_query = cursor.execute("select * from active_predicted where ticketId=%s LIMIT 1", ticketId)
        row = cursor.fetchone()
        if row:
            return json.dumps(row)
        else:
            return "Nothing found \n SQL Query: " + "select * from active_predicted where ticketId=" + str(ticketId)
    finally:
        cursor.close()

【讨论】:

  • 谢谢!这个解决方案对我有用。由于错误,我不得不更改一些值,但代码大多保持不变。你能告诉我这个代码和我的原始代码有什么不同,以及为什么我的原始代码不起作用?再次非常感谢您!
  • @Jimmy:很高兴你解决了这个问题。我在答案中添加了解释。
猜你喜欢
  • 1970-01-01
  • 2019-05-10
  • 2016-07-24
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2016-02-27
相关资源
最近更新 更多