2013-05-28 40 views
0

我的代碼:YQL - 沒有清晰發現表

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

沒有..它說定義沒有找到,即使在你指定的鏈接 – karthikr

回答

3

由於yahoo.finance.option_contracts表是Community Open Data Table您將希望將其作爲查詢環境的一部分。最簡單的方法是加載所有社區表的環境文件;就像在YQL控制檯中單擊「顯示社區表」一樣。

通常情況下,您可以通過在查詢本身中在YQL查詢URL或子句中指定env=...參數來完成此操作。

您正在使用的Python庫允許您將環境文件作爲參數傳遞給​​。

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) 

您仍然可以覆蓋envy.execute()獨立呼叫,如果你需要。

+0

謝謝。有沒有辦法將env作爲初始化的一部分提供,而不必將每個execute()傳遞給它? – Vishal

+0

不,但是擴展'yql.Public'來做這件事並不是一個大量的工作。看到我編輯的答案。 – salathe