2016-02-24 1 views
0

Я пытаюсь использовать datastore_api в CKAN (ckan.org) и хочу удалить все записи с идентификатором выше X - моя цель - просто удалить ВСЕ записи без удаление таблицы.Удалить все записи с идентификатором выше X в CKAN

Docs: http://docs.ckan.org/en/ckan-2.5.1/maintaining/datastore.html?highlight=filter#ckanext.datastore.logic.action.datastore_delete

Запуск в API с

'filters': {'_id': '0'} 

делает работу, но настройка

{'_id': '>0'} 

или

{'_id': '*'} fails. 

Как я могу удалить таблицу в хранилище данных, не удаляя таблицу?

SQL, генерируется в CKAN является:

...9b89-7ab1c36c8e00" WHERE ("_id" = '*') ... 

Так что имеет смысл, почему это не удается, но я не знаю, как использовать API вызовы с либо групповыми символами или «выше».

Это, кажется, код:

def delete_data(context, data_dict): 
    validate(context, data_dict) 
    fields_types = _get_fields_types(context, data_dict) 

    query_dict = { 
     'where': [] 
    } 

    for plugin in p.PluginImplementations(interfaces.IDatastore): 
     query_dict = plugin.datastore_delete(context, data_dict, 
              fields_types, query_dict) 

    where_clause, where_values = _where(query_dict['where']) 
    sql_string = u'DELETE FROM "{0}" {1}'.format(
     data_dict['resource_id'], 
     where_clause 
    ) 

    _execute_single_statement(context, sql_string, where_values) 

... 

def _where(where_clauses_and_values): 
    '''Return a SQL WHERE clause from list with clauses and values 

    :param where_clauses_and_values: list of tuples with format 
     (where_clause, param1, ...) 
    :type where_clauses_and_values: list of tuples 

    :returns: SQL WHERE string with placeholders for the parameters, and list 
     of parameters 
    :rtype: string 
    ''' 
    where_clauses = [] 
    values = [] 

    for clause_and_values in where_clauses_and_values: 
     where_clauses.append('(' + clause_and_values[0] + ')') 
     values += clause_and_values[1:] 

    where_clause = u' AND '.join(where_clauses) 
    if where_clause: 
     where_clause = u'WHERE ' + where_clause 

    return where_clause, values 
+0

Вы прочитали соответствующий бит кода? –

+1

Добавленный комментарий в вопрос ... –

ответ

1

Примечание: Существовал ошибка нашли из-за этого вопроса. Кажется, что невозможно удалить только данные из datastore. Запрос на извлечение, чтобы исправить это, уже отправлен по адресу https://github.com/ckan/ckan/pull/2885.

Название вопроса спрашивает, как удалить все записи с идентификатором выше X, но в своем вопросе вы сказали, что ваша цель - «просто удалить ВСЕ записи без удаления таблицы». Вот что я отвечаю здесь.

Согласно документации на http://docs.ckan.org/en/ckan-2.5.1/maintaining/datastore.html?#ckanext.datastore.logic.action.datastore_delete:

ckanext.datastore.logic.action.datastore_delete (контекст, data_dict) Удаляет таблицу или набор записей из хранилища данных.

Параметры:

  • resource_id (строка) - идентификатор ресурса, что данные будут удалены из. (необязательно)
  • force (bool (необязательно, по умолчанию: False)) - установите значение True для редактирования ресурса только для чтения
  • фильтры (словарь) - фильтры перед удалением (например, {"name": "fred «}). Если отсутствует, удалите всю таблицу и все зависимые виды. (Опционально)

выделено мной.

Если вы не передали атрибут filters, CKAN удалит таблицу. Если вы передадите фильтры как {}, он удалит содержимое всей таблицы.

+0

Анализ «фильтров»: {} фактически удаляет таблицу, а не только строки. –

+0

Эта линия: https://github.com/ckan/ckan/blob/f74575024a472085db2c8238d8f0ff71d888ffaf/ckanext/datastore/db.py#L1169 является удаление фильтров аргумент из data_dict. Это означает, что, когда db.delete наконец называется здесь: https://github.com/ckan/ckan/blob/f74575024a472085db2c8238d8f0ff71d888ffaf/ckanext/datastore/db.py#L1169 ... что база данных будет всегда удален. Это ошибка, я пошлю PR, чтобы исправить это в ближайшее время. – TkTech

+0

@TkTech отправил запрос на вытягивание по адресу https://github.com/ckan/ckan/pull/2885. –