Ищу самый простой способ регулярного обновления связанных ресурсов CKAN - PullRequest
0 голосов
/ 17 декабря 2018

Я ищу самый простой способ обновления хранилища данных CKAN при обновлении связанных ресурсов.В этом случае все ресурсы связаны (без загрузки).Ресурсы CSV и регулярно обновляются.Когда происходят обновления в CSV-файлах, эти изменения, по-видимому, автоматически не регистрируются хранилищем данных CKAN.Я пытался использовать ckanapi, но функция update_resource появляется только для обновления метаданных.Я не смог заставить его постоянно обновлять DataStore (таким образом, представление Data Explorer содержит устаревшую информацию).

Если нет более простого метода, я бы предпочел найти способ программно вызвать кнопку «Загрузить в хранилище данных», которую можно найти на вкладке хранилища данных для данного ресурса.Я провел довольно обширный поиск и пока не смог найти способ сделать это.Любые предложения приветствуются.

Текущая версия CKAN - CKAN 2.8.1 с включенными расширениями DataStore и DataPusher.

1 Ответ

0 голосов
/ 20 декабря 2018

Вы должны быть в состоянии сделать это с помощью скрипта, использующего API CKAN, в частности datapusher_submit (см. Ниже).

Вот пример скрипта Python, который я использовал в прошлом.

Есть также PR, открытый , чтобы помочь немного лучше документировать это, но еще не было объединено.

#!/usr/bin/env python
import urllib2
import urllib
import json
import pprint


# We'll use the package_search function to get all of the resources.
# NOTE: there may be a limit on this in the future and would have to then make multiple calls to collect
# all of the resources. Datasets has a hard-limit of 1000 but defaults to 10. So for now this works, but future issue maybe.
resources_request = urllib2.Request(
    'http://ckan-site.com/api/3/action/resource_search?query=name:')

# Make the HTTP request.
resources_response = urllib2.urlopen(resources_request)
# Make sure it worked
assert resources_response.code == 200

# Use the json module to load CKAN's response into a dictionary.
resources_response_dict = json.loads(resources_response.read())
assert resources_response_dict['success'] is True

results = resources_response_dict['result']['results']

for result in results:
  '''Loop over the resources and submit them to the datastore.
  '''
  try:
    request = urllib2.Request('http://ckan-site.com/api/3/action/datapusher_submit')

    data_dict = {
      "resource_id":result['id']
      }

    data_string = urllib.quote(json.dumps(data_dict))

    request.add_header('Authorization', 'your-token-here')

    response = urllib2.urlopen(request, data_string)
    assert json.loads(response.read())['success'] is True
  except:
    # Catch and print any issues and keep going.
    print "resource_id: "  + result['id']
    continue

print "Complete. Datastore is now up to date."
...