2016-02-24 41 views
0

我試圖在CKAN(ckan.org)中使用datastore_api並想要刪除ID高於X的所有記錄 - 我的目標是簡單地刪除所有記錄刪除表格。刪除CKAN中ID高於X的所有記錄

文檔: 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. 

如何在不刪除表的情況下清空數據存儲中的表?

在CKAN生成的SQL是:

...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

你問題的標題問如何刪除ID高於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(串) - 資源ID,該數據將從被刪除。 (可選)
  • force(bool(可選,默認:False)) - 設置爲True編輯只讀資源
  • 過濾器(字典) - 刪除前應用的過濾器(例如{「name」:「fred 「})。 如果缺少刪除整個表格和所有依賴視圖。 (可選)

重點是我的。

如果您未通過filters屬性,CKAN將刪除表本身。如果您通過過濾器{},它會刪除所有表格的內容。

+0

解析'filters':{}實際上刪除了表格,而不僅僅是行。 –

+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發送拉取請求。 –