0

我的代码:

import yql
y = yql.Public()
query = 'SELECT * FROM yahoo.finance.option_contracts WHERE symbol="SPY"'
y.execute(query)

结果:

yql.YQLError: No definition found for Table yahoo.finance.option_contracts

我知道该表存在,因为我可以在http://developer.yahoo.com/yql/console/上测试查询并且它可以工作。我错过了什么?

更新:我将 url 发布到控制台,但没有发布我在控制台中尝试的查询。查询现已附加。

http://goo.gl/mNXwC
4

2 回答 2

3

由于该yahoo.finance.option_contracts表是社区开放数据表,因此您需要将其作为查询环境的一部分。最简单的方法是加载所有社区表的环境文件;就像在 YQL 控制台中单击“显示社区表”一样。

通常可以通过env=...在 YQL 查询 URL 中指定一个参数,或者(如您所做的)use在查询本身中使用一个子句来做到这一点。

您使用的 Python 库允许您将环境文件作为参数传递给execute().

import yql
y = yql.Public()
query = 'SELECT * FROM yahoo.finance.option_contracts WHERE symbol="SPY"'
y.execute(query, env="store://datatables.org/alltableswithkeys")

这是一个扩展示例,yql.Public以便能够在实例化时定义默认环境。

class MyYql(yql.Public):

    def __init__(self, api_key=None, shared_secret=None, httplib2_inst=None, env=None):
        super(MyYql, self).__init__(api_key, shared_secret, httplib2_inst)
        self.env = env if env else None

    def execute(self, query, params=None, **kwargs):
        kwargs["env"] = kwargs.get("env", self.env)
        return super(MyYql, self).execute(query, params, **kwargs);

它可以像这样使用:

y = MyYql(env="store://datatables.org/alltableswithkeys")
query = 'SELECT * FROM yahoo.finance.option_contracts WHERE symbol="SPY"'
r = y.execute(query)

如果需要,您仍然可以env在单个调用中覆盖 。y.execute()

于 2013-05-28T07:08:36.610 回答
0

将查询修改为以下内容是可行的。

查询='使用“ http://www.datatables.org/yahoo/finance/yahoo.finance.option_contracts.xml ”作为foo;SELECT * FROM foo WHERE symbol="SPY"'

可能存在更优雅的解决方案。如果这样做,请分享。谢谢。

于 2013-05-28T03:31:44.520 回答