YQL - 找不到表的定义

时间:2013-05-28 02:54:38

标签: python yql yahoo-finance

我的代码:

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/测试查询并且它有效。我错过了什么?

更新:我将网址发布到控制台,但不是我在控制台中尝试的查询。现在附上了查询。

http://goo.gl/mNXwC

2 个答案:

答案 0 :(得分:3)

由于yahoo.finance.option_contracts表是Community Open Data Table,您需要将其作为查询环境的一部分包含在内。最简单的方法是加载所有社区表的环境文件;就像点击YQL控制台中的“显示社区表”一样。

通常可以通过在YQL查询URL中指定env=...参数,或者(如您所做)在查询本身中使用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()

答案 1 :(得分:0)

修改以下查询是有效的。

  

query ='use“http://www.datatables.org/yahoo/finance/yahoo.finance.option_contracts.xml”as foo; SELECT * FROM foo WHERE symbol =“SPY”'

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