flask(flask restful)和mysqldb(pymysql)存在奇怪的并发问题

lb3vh1jj  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(416)

我有一个使用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()

这也与竞争条件无关,因为查询不会写入任何内容。我试着和服务员一起递交申请表,但我还是遇到了问题。

wh6knrhe

wh6knrhe1#

而对于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()

相关问题