使用 Python 和 mySQL(以及作为操作系统的 windows), cursor.execute() 不返回任何结果,但它正在连接

Posted

技术标签:

【中文标题】使用 Python 和 mySQL(以及作为操作系统的 windows), cursor.execute() 不返回任何结果,但它正在连接【英文标题】:Using Python and mySQL (and windows as OS), cursor.execute() is returning no results but it is connecting 【发布时间】:2018-01-20 04:13:24 【问题描述】:

所以我有一个与this question 非常相似的问题,但有点不同。

我在一段 sql 上调用 cursor.execute(sqlString),当我直接在 mysql 工作台上运行它时,它运行良好。但是,当我运行代码时,我没有得到任何结果集。

我的问题症状与链接中所述完全相同,并且我尝试了链接的解决方案,但事实证明我没有相同的问题。

返回时我的 _stored_results[] 为空。

我在 try/except 块中使用代码,我有另一个 python 程序,它使用相同的代码将 csv 加载到我的 mySQL 数据库中,它运行得很好。

我遇到问题的代码在 @app.route 中,如果这有什么不同的话。

我的代码如下所示:

def functionName() :
    try:
        import mysql.connector
        from mysql.connector import errorcode

        cnx = mysql.connector.connect(user=init["dbDetails"][0], password=init["dbDetails"][1], host=init["dbDetails"][2], database=init["dbDetails"][3])
        cur = cnx.cursor()
        cur.close()         #I deffo don't need the two lines below but they were added for a sanity check, just to make sure the cur was not being read from any other code.
        cur = cnx.cursor()  # and this one obviously

        sqlString = 'CALL `schemaName`.`getProcedureName_sp`(1, 1, 0)'
        cur.execute(sqlString, multi=True) # tried it here without the multi=True and got the msg telling me to use it.

        getSomeDetails = cur.fetchall()

        cnx.commit() # probably don't need to commit here I am just reading from the dB but I am trying anything as I have no idea what my issue might be.

        return render_template('success.html')          

    except Exception as e:
        return render_template('error.html', error = str(e)) 
    finally:
        cur.close()
        cnx.close()

我很困惑,因为我在多个地方都有相同的代码。

【问题讨论】:

【参考方案1】:

所以我用这个把头撞到墙上,当我无法到达任何地方时,我就决定离开它继续前进,然后带着新的想法回来。嗯...它工作了,有点。

所以我还没有找到解决方案,但我找到了一种解决方法,可以完成这项工作,甚至可能对我的代码中实际发生的情况有所了解。

我决定由于 fetchall() 方法给我带来了麻烦,我应该尝试绕过它。

我在调用 fetchall() 方法之前探测了 cursor(cur),发现 cur._rows 包含 SQL 调用的结果。

所以我换行了

getSomeDetails = cur.fetchall()

if len(cur._rows) > 0 :
    getSomeDetails = list(cur._rows[0]) #I only ever expect one result in this query

#getSomeDetails should now have the row I am looking for
getSomeDetails[0] #gets me the field I am looking for

现在我的变量 getSomeDetails 具有来自过程调用的返回值

然而,它们的格式并不好,我应该从 fetchall() 函数中获取它们,所以我必须进行一些处理,我必须确保我得到了一些值,并且我注意到这些值是以元组形式返回

我在运行两个不同操作系统和两个不同版本的 python(Windows 7 和 Python 2.7 和 Windows 10 和 Python 3)的两台不同机器上遇到了这个问题,这两段代码都不同,所以很明显我使用的是两个不同的MySQL 库,因此修复的实际代码在这两种情况下都略有不同,但我现在在这两种情况下都将数据从我的数据库中获取到 Python 中的变量中,这很酷。

但是,这是一个 hack,我知道,我宁愿使用正确的函数 cur.fetchall(),所以我仍然愿意接受关于这里可能出错的建议。

【讨论】:

以上是关于使用 Python 和 mySQL(以及作为操作系统的 windows), cursor.execute() 不返回任何结果,但它正在连接的主要内容,如果未能解决你的问题,请参考以下文章

python + docker, 实现天气数据 从FTP获取以及持久化-- python操作MySQL数据库

在 python 中使用 pass 语句作为使代码更具可读性的一种方式?有关系吗?

python链接mysql以及常用语法

怎么使用navicat for mysql建模时画出关系线

Python/MySQL表操作以及连接

自订类的属性与字段如何枚举并提供控件作为系结来源?