2016-04-07 40 views
0

最近、私はmysql.connectorを使用して複数のセミコロンの記述文を1つのクエリで実行する必要があるPython 2.7xプロジェクトを作成しました。これはこのpost.でうまく説明されています。複数のクエリを実行するためにMySQL.connectorを使用する

しかし、現在のプロジェクトではTwistedのmysql.connectorを使用する必要がありました。これはTwistedの優れたenterprise.adbapiモジュールを使用して、新しいブロッキングデータベース接続を非ブロック化することを意味します。

コンフィグ= { "ユーザ":ユーザ名、 "パスワード":パスワード、 "ホスト":ホスト名、 "データベース":データベース名、 "raise_on_warnings":真} CP = adbapi.ConnectionPool( "のMySQL。コネクタ "、** config)

私のテストステートメントは以下のように定義されています。私は彼らが軽蔑的な例であることをお詫びしますが、私は期待した結果を知っています。そして、私は複数のステートメントの結果を得ていることを確認するだけで十分です。

:私は今のConnectionPoolメソッド.runQuery()

def _print_result(result): 
     if result: 
      print("this is a result") 
      print(result) 
     else: 
      print("no result") 
     reactor.stop() 

    d = cp.runQuery(statements, multi=True) 
    d.addBoth(_print_result) 

これは私に次のような結果を得るを実行しようとすると、

statement1 = "SELECT * FROM queue WHERE id = 27;" 
    statement2 = "SELECT * FROM order WHERE id = 1;" 
    statement_list = [statement1, statement2] 
    statements = " ".join(statement_list) 

は問題が来ます

これは結果です[Failure instance:トレースバック::フェッチ元の結果が設定されていません。

Twistedのadbapiモジュールを使用して、私が知っている結果を得るにはどうすればよいですか?

答えて

0

したがって、adbapi.ConnectionPool.runQuery()を使用する場合、デフォルトの動作では、データベース照会の結果をcursor.fetchall()メソッドに送信することがわかります。しかし、mysql.connectorを使用している場合、これはねじれなくても動作しません。代わりに、結果セットを反復処理し、セットの各メンバーでfetchall()を呼び出す必要があります。

私がこれを解決した方法は、以下のサブクラスであった。 twisted.enterpriseインポートadbapi

クラスNEWadbapiConnectionPool(adbapi.ConnectionPool)から

def __init__(self, dbapiName, *connargs, **connkw): 
    adbapi.ConnectionPool.__init__(self, dbapiName, *connargs, **connkw) 

def runMultiQuery(self, *args, **kw): 
    return self.runInteraction(self._runMultiQuery, *args, **kw) 

def _runMultiQuery(self, trans, *args, **kw): 
    result = trans.execute(*args, **kw) 
    result_list = [] 
    for item in result: 
     if item.with_rows: 
      result_list.append(item.fetchall()) 
    return result_list 

ので、今、私は次のように作成します。

def _print_result(result): 
     if result: 
      print("this is a result") 
      print(result) 
     else: 
      print("no result") 
     reactor.stop() 

    cp = NEWadbapiConnectionPool("mysql.connector", **config) 
    d = cp.runMultiQuery(statements, multi=True) 
    d.addBoth(_print_result) 

と入力し、各ステートメントの結果のリストを取得します。

私は他の誰かがこれを見つけることを望みます。

関連する問題