2016-10-04 4 views
0

Twisted 및 runQuery를 사용하여 Oracle에서 일부 데이터를 가져 오려고 시도하고 실제 데이터 대신 지연된 데이터를 계속 가져 오려고합니다. 어떻게 해결할 수 있습니까? 일부 코드 (I는 불필요한 부분을 제외하지만, 아이디어가 명확해야한다) : 그 중요한 경우Twisted 및 Oracle이있는 데이터 대신 dbpool.runQuery에서 연기받습니다.

from twisted.enterprise import adbapi 
from twisted.internet import defer 
import service_config 

ORACLE_DSN = service_config.oracle_dsn 
ORACLE_USER = service_config.oracle_user 
ORACLE_PASSWORD = service_config.oracle_password 
dbpool = adbapi.ConnectionPool('cx_Oracle', 
    user=ORACLE_USER, 
    password=ORACLE_PASSWORD, 
    dsn=ORACLE_DSN, port='49161') 

@defer.inlineCallbacks 
def ask_db(): 
    data = yield dbpool.runQuery("SELECT * FROM customer") 

a = ask_db() 
print(a) 

나는, 다른 모듈 원자로 운전을 얻었다. 미리 감사드립니다.

UPDATE : @의 도움으로 데이터를 반환 코드를 작업 대신 파이썬 3.5 이연있어 notorious.no :

당신은 항상 이연 반환하는 inlineCallback를 호출하고 있기 때문에 당신이 이연받을
@defer.inlineCallbacks 
def ask_db(request): 
    data = yield dbpool.runQuery(request) 

    return defer.returnValue(data) 
+0

당신은 .. 당신의 ask_db 함수에서 아무것도 반환하지 않습니다, 무슨는 어떻게됩니까? – James

+0

ask_db()를 의미합니까? data = yield dbpool.runQuery ("SELECT * FROM customer") print (data)? 그렇다면 아무것도 변경되지 않습니다. –

답변

0

. yield의 의미를 잘못 해석하고있는 것입니다. 실제로는 결과를 기다리는 inlinceCallback에서 값을 반환하지 않습니다. 값을 반환하려면 defer.returnValue()을 사용하십시오 (파이썬 3.4 이상을 사용하는 경우 간단하게 return을 사용할 수 있습니다). 이 코드를 어떻게 보일지입니다 :

from __future__ import print_function 
#... 

@defer.inlineCallbacks 
def ask_db(): 
    data = yield dbpool.runQuery("SELECT * FROM customer") 
    defer.returnValue(data) # actually return a value 

a = ask_db() # this returns a Deferred so add callbacks! 
a.addCallback(print) # add a useful callback to processes query list 
reactor.run() 

이전했고,이 답변은 값으로 runQuery() 반환, 콜백이 실행되고 ask_db() 실제로을 반환 할 때 콜백이 그렇게 추가됩니다 무엇의 차이 가치있는 것. 당신이 ask_db 내부 인쇄 (데이터)에 인쇄 (A)를 변경하는 경우

참조

+0

감사합니다! defer.returnValue (data) 및 a.addCallback (다른 func)을 사용했지만 여전히 동일한 결과가 나타납니다. 심지어 addCallback의 'some func'도 시작되지 않으므로 Deferred에서 yield가 유지되고 데이터 나 실패로 변경되지 않습니다. ConnectionPool이 실제로 DB에 연결되지 않는 경우가있을 수 있습니까? 또는 ConnectionError를 반환해야합니까? 내가 언급 한 것을 잊어 버렸습니다. 파이썬 3.5를 사용합니다. 그리고 다른 모듈에서 원자로가 실행 중이므로 reactor.run()을이 모듈에 추가해야합니까? –

+0

"나는 defer.returnValue (데이터)와 a.addCallback (다른 func)을 사용했지만 여전히 같은 결과를 보였습니다." 나는이 질문을 게시하기 전에 그것을 사용했다는 것을 의미했다. 그리고 지금도 사용해 보았습니다. 그리고 여전히 결과로 연기되었습니다. –

+0

''print (a)''또는''print (ask_db())''하고 있습니까? 쿼리 결과를 제공하지 않기 때문에 지연된 개체가 인쇄됩니다. 콜백이 시작되지 않는 이유를 모르겠다. 동기 구문을 사용하면 어떻게 될까? ''cx_Oracle.connect (user, pswd, dsn, port)''를 실행하면 어떻게됩니까? –