【问题标题】:YQL - No definition found for TableYQL - 找不到表的定义
【发布时间】:2013-05-28 02:54:37
【问题描述】:

我的代码:

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

【问题讨论】:

  • Nope.. 它说即使在您指定的链接中也找不到定义

标签: python yql yahoo-finance


【解决方案1】:

由于yahoo.finance.option_contracts 表是Community Open Data Table,您需要将其作为查询环境的一部分包含在内。最简单的方法是为 all 社区表加载环境文件;就像在 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)

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

【讨论】:

  • 谢谢。有没有办法提供 env 作为初始化的一部分,而不是在每次执行时都传递它?
  • 不,但是扩展yql.Public 来做到这一点并不是一项巨大的工作。请参阅我编辑的答案。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多