使用Twisted和Oracle从dbpool.runQuery而不是数据中获取延迟

时间:2016-10-04 16:57:56

标签: python oracle twisted deferred

我正在尝试从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) 

1 个答案:

答案 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()实际返回您关注的值。

参考