我的代码:
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
答案 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”'
可能存在更优雅的解决方案。请分享,如果这样做。感谢。