我正在尝试从Oracle获取一些数据,使用Twisted和runQuery并继续获取Deferred而不是实际数据。 怎么解决这个问题? 一些代码(我排除了一些不必要的部分,但想法应该清楚):
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)
如果重要的话,我让反应堆在其他模块中运行。 提前谢谢。
更新: 在@ notorious.no的帮助下得到了工作代码,返回数据而不是使用Python 3.5延迟:
@defer.inlineCallbacks
def ask_db(request):
data = yield dbpool.runQuery(request)
return defer.returnValue(data)
答案 0 :(得分:0)
您获得延期,因为您正在调用始终返回延期的inlineCallback
。你也误解了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()
实际返回您关注的值。