我有一个使用MySQL数据库的flask restful项目,我目前正在使用PyMysql连接数据库,我之前尝试过使用flask mysqldb和flask MySQL,但它们没有真正成功,因为我需要在请求方法外部使用db连接(主要用于装饰器(,所以我开始使用PyMysql,但现在我发现了并发问题,每当我试图同时发出两个以上的并发请求(这意味着两个并发查询(时,我都会收到以下错误:
mysqldb._exceptions.programmingerror: (2014, "commands out of sync; you can't run this command now")
事实上,我在每次查询后都会调用cursor.nextset
,以确保结果被完全使用,并且我确实确保了我的所有查询和存储过程都是正确的,没有任何问题,我开始认为这个问题是由服务器只使用一个光标引起的,因为光标是在一个单独的模块中定义的,所有视图/资源都会导入它来完成工作(它们不会创建新的光标(,但在我完成每个视图/资源方法后,都会创建一个新的光标来完成工作,然后关闭它,我仍然会收到同样的错误。这就是我执行查询的方式:
cursor.callproc('do_something', (arg1, arg2))
result = cursor.fetch_all()
cursor.nextset()
它也与竞赛条件无关,因为查询不会写入任何内容。我试着向女服务员提供申请,但我还是遇到了问题。
对于MySQLdb存储过程
cursor.callproc('do_something', (arg1, arg2))
在这里,您必须为所有输出参数添加一个可变
cursor.execute('SELECT @outparameter1, @outparameter2, @outparameter3')
cursor.fetchall()
对于pymyslq,您需要更多的更改,因为没有callproc
cusrorType = pymysql.cursors.DictCursor
databaseConnection = pymysql.connect(host=hostName,
user=userName,
password=userPassword,
db=databaseName,
charset=databaseCharset,
cursorclass=cusrorType)
try:
# Cursor object creation
cursorObject = databaseConnection.cursor()
# Execute the sqlQuery
cursorObject.execute("call do_something(?,?)",arg1, arg2)
# Print the result of the executed stored procedure
for result in cursorObject.fetchall():
print(result)
对于mysq.connector您必须像一样在手动之前调用`store_result
cursor.callproc('do_something', (arg1, arg2))
for result in cursor.stored_results():
result.fetchall()