2016-10-04 27 views
0

我想從Oracle獲取一些數據,使用Twisted和runQuery並繼續獲取延遲而不是實際數據。 這怎麼解決? 一些代碼(我排除一些不必要的部分,但這個想法應該清楚):從dbpool.runQuery獲取延遲,而不是使用Twisted和Oracle的數據

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: 隨着@幫助notorious.no得到了工作代碼,返回數據,而不是使用Python 3.5遞延:

@defer.inlineCallbacks 
def ask_db(request): 
    data = yield dbpool.runQuery(request) 

    return defer.returnValue(data) 
+0

你,如果你改變你的打印(一)內部ask_db打印(數據)並沒有從ask_db函數返回任何東西..,什麼接下來會發生? – James

+0

您的意思是def ask_db(): data = yield dbpool.runQuery(「SELECT * FROM customer」)print(data)?如果是,沒有任何變化。 –

回答

0

你得到遞延因爲你調用一個inlineCallback它總是返回一個deferred 。你也誤解了yield的功能。它實際上並沒有從inlinceCallback返回一個值,只是等待結果。使用defer.returnValue()返回一個值(如果您使用的是Python 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()的實際返回的區別你關心的價值。

參考

+0

謝謝! 我使用defer.returnValue(數據)和a.addCallback(一些其他函數),但仍然是相同的結果。甚至更多 - addCallback中的'其他func'甚至不會啓動,因此對於我來說,它看起來像yield在Deferred中並且不會更改爲數據或失敗。 是否可以在ConnectionPool沒有真正連接到數據庫的情況下使用?或者它必須返回一些ConnectionError? 我忘了提及,我使用Python 3.5。 而且我有另一個模塊運行反應堆,那麼是否需要將reactor.run()添加到此模塊中? –

+0

當我說「我使用了defer.returnValue(data)和a.addCallback(一些其他函數),但仍然是相同的結果。」我的意思是我在發佈這個問題之前使用了它。 我現在也嘗試使用它。結果仍然推遲。 –

+0

你正在做''print(a)''或''print(ask_db())''?因爲這不會給出查詢的結果,所以會打印Deferred對象。不知道爲什麼回調不啓動,當你使用同步語法時會發生什麼?當你運行''cx_Oracle.connect(user,pswd,dsn,port)''時會發生什麼? –