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/ и это работает. Что мне не хватает?

Обновление: я разместил URL-адрес в консоли, но не запрос, который я пробовал в консоли. Теперь запрос прикреплен.

http://goo.gl/mNXwC

person Vishal    schedule 28.05.2013    source источник
comment
Нет.. Он говорит, что определение не найдено даже в указанной вами ссылке   -  person karthikr    schedule 28.05.2013


Ответы (2)


Поскольку таблица yahoo.finance.option_contracts является таблицей открытых данных сообщества, вы захотите включить ее как часть среды запроса. Самый простой способ сделать это — загрузить файл среды для всех столов сообщества; точно так же, как нажать «Показать таблицы сообщества» в консоли YQL.

Обычно это можно сделать, указав параметр env=... в URL-адресе запроса YQL или (как вы сделали) с предложением 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(), если вам это нужно.

person salathe    schedule 28.05.2013
comment
Спасибо. Есть ли способ предоставить env как часть инициализации вместо того, чтобы передавать его с каждым execute()? - person Vishal; 28.05.2013
comment
Нет, но расширить yql.Public для этого не так уж и сложно. Смотрите мой отредактированный ответ. - person salathe; 28.05.2013

Изменение запроса на следующее - это то, что работает.

query = 'use "http://www.datatables.org/yahoo/finance/yahoo.finance.option_contracts.xml" как foo; SELECT * FROM foo WHERE symbol="SPY"'

Могут существовать более элегантные решения. Пожалуйста, поделитесь, если такое сделать. Спасибо.

person Vishal    schedule 28.05.2013