2017-08-25 10 views
0

EDIT:私は今pyodbcとpymysqlを試してみましたが、同じ結果(ストアドプロシージャを呼び出すとゼロ行が返されます)があります。これは、MySQL ODBC 5.3ドライバ(libmyodbc5w.so)を使用してUbuntu 16.04.2 LTS上にあることを前に言いました。MySQLのストアドプロシージャが0行を返すことがあります


私は、Python 3.5.2でpymysql(0.7.11)を使用して、MySQL 5.6.10データベースに対してさまざまなストアドプロシージャを実行しています。私は奇妙で矛盾した問題にぶち当たっています。時折ゼロの結果が返されることがありますが、私はすぐに同じコードを再実行して、私が期待する行の数を得ることができます。

コードは非常に簡単です...

from collections import OrderedDict 
import pymysql 
from pymysql.cursors import DictCursorMixin, Cursor 

class OrderedDictCursor(DictCursorMixin, Cursor): 
    dict_type = OrderedDict 

try: 
    connection = pymysql.connect( 
     host=my_server, 
     user=my_user, 
     password=my_password, 
     db=my_database, 
     connect_timeout=60, 
     cursorclass=pymysql.cursors.DictCursor 
     ) 

    param1 = '2017-08-23 00:00:00' 
    param2 = '2017-08-24 00:00:00' 

    proc_args = tuple([param1, param2]) 

    proc = 'my_proc_name' 

    cursor = connection.cursor(OrderedDictCursor) 
    cursor.callproc(proc, proc_args) 
    result = cursor.fetchall() 
except Exception as e: 
    print('Error: ', e) 
finally: 
    if not isinstance(connection, str): 
     connection.close() 

多くの場合、それだけで正常に動作します。しかし、しばらくしては、ほぼ即座に完了しますが、結果セットにはゼロの行があります。私が見ることができる何のエラーも何も、ただ何も...それをもう一度実行しても問題はありません。

答えて

1

問題はpymysql、odbcなどとは関係がありませんでしたが、パラメータがストアドプロシージャに渡される順序に問題があったことがわかりました。

私のデスクトップでは、Python 3.6を使用していましたが、うまくいきました。私は、3.5.2と3.6の間の変更の1つが、json.loadsを介して辞書オブジェクトに追加された項目がどのように順序づけられたかに影響したことを認識しませんでした。

渡されるパラメータは、もともとjson.loads経由人口のdictオブジェクトから来ていた...彼らは事前3.6順不同あったため、コードを実行すると、時折私のSTARTTIMEおよびENDTIMEパラメータはMySQLのストアドプロシージャに渡されたことを意味します後方に。したがって、ゼロ行が返されます。

これが問題であることを認識したら、それを修正することは、object_pairs_hook = OrderedDictをjson.loads部分に追加することに過ぎませんでした。

関連する問題