使用 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数据库