def datastore_upsert(context, data_dict): '''Updates or inserts into a table in the datastore :param resource_id: resource id that the data is going to be stored under. :type resource_id: string :param records: the data, eg: [{"dob": "2005", "some_stuff": ['a', b']}] :type records: list of dictionaries :param method: the method to use to put the data into the datastore possible options: upsert (default), insert, update :param upsert: update if record with same key already exists, otherwise insert :param insert: insert only, faster because checks are omitted :param update: update only, exception if duplicates occur :type method: string :returns: the newly created data object. :rtype: dictionary ''' model = _get_or_bust(context, 'model') id = _get_or_bust(data_dict, 'resource_id') if not model.Resource.get(id): raise p.toolkit.ObjectNotFound(p.toolkit._( 'Resource "{0}" was not found.'.format(id) )) p.toolkit.check_access('datastore_upsert', context, data_dict) data_dict['connection_url'] = pylons.config['ckan.datastore_write_url'] result = db.upsert(context, data_dict) result.pop('id') result.pop('connection_url') return result
def datastore_upsert(context, data_dict): '''Updates or inserts into a table in the datastore :param resource_id: resource id that the data is going to be stored under. :type resource_id: string :param records: the data, eg: [{"dob": "2005", "some_stuff": ['a', b']}] :type records: list of dictionaries :param method: the method to use to put the data into the datastore possible options: upsert (default), insert, update :param upsert: update if record with same key already exists, otherwise insert :param insert: insert only, faster because checks are omitted :param update: update only, exception if duplicates occur :type method: string :returns: the newly created data object. :rtype: dictionary ''' model = _get_or_bust(context, 'model') id = _get_or_bust(data_dict, 'resource_id') if not model.Resource.get(id): raise p.toolkit.ObjectNotFound( p.toolkit._('Resource "{0}" was not found.'.format(id))) p.toolkit.check_access('datastore_upsert', context, data_dict) data_dict['connection_url'] = pylons.config['ckan.datastore_write_url'] result = db.upsert(context, data_dict) result.pop('id') result.pop('connection_url') return result
def datastore_upsert(context, data_dict): '''Updates or inserts into a table in the datastore The datastore_upsert API action allows a user to add or edit records to an existing dataStore resource. In order for the *upsert* and *update* methods to work, a unique key has to be defined via the datastore_create action. The available methods are: *upsert* Update if record with same key already exists, otherwise insert. Requires unique key. *insert* Insert only. This method is faster that upsert, but will fail if any inserted record matches an existing one. Does *not* require a unique key. *update* Update only. An exception will occur if the key that should be updated does not exist. Requires unique key. :param resource_id: resource id that the data is going to be stored under. :type resource_id: string :param records: the data, eg: [{"dob": "2005", "some_stuff": ["a","b"]}] :type records: list of dictionaries :param method: the method to use to put the data into the datastore. Possible options are: upsert (default), insert, update :type method: string **Results:** :returns: The modified data object. :rtype: dictionary ''' if 'id' in data_dict: data_dict['resource_id'] = data_dict['id'] res_id = _get_or_bust(data_dict, 'resource_id') data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''') results = db._get_engine(None, data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound(p.toolkit._( 'Resource "{0}" was not found.'.format(res_id) )) p.toolkit.check_access('datastore_upsert', context, data_dict) result = db.upsert(context, data_dict) result.pop('id', None) result.pop('connection_url') return result
def datastore_upsert(context, data_dict): '''Updates or inserts into a table in the datastore The datastore_upsert API action allows a user to add or edit records to an existing dataStore resource. In order for the *upsert* and *update* methods to work, a unique key has to be defined via the datastore_create action. The available methods are: *upsert* Update if record with same key already exists, otherwise insert. Requires unique key. *insert* Insert only. This method is faster that upsert, but will fail if any inserted record matches an existing one. Does *not* require a unique key. *update* Update only. An exception will occur if the key that should be updated does not exist. Requires unique key. :param resource_id: resource id that the data is going to be stored under. :type resource_id: string :param records: the data, eg: [{"dob": "2005", "some_stuff": ["a","b"]}] :type records: list of dictionaries :param method: the method to use to put the data into the datastore. Possible options are: upsert (default), insert, update :type method: string **Results:** :returns: The modified data object. :rtype: dictionary ''' if 'id' in data_dict: data_dict['resource_id'] = data_dict['id'] res_id = _get_or_bust(data_dict, 'resource_id') data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''' ) results = db._get_engine(None, data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound( p.toolkit._('Resource "{0}" was not found.'.format(res_id))) p.toolkit.check_access('datastore_upsert', context, data_dict) result = db.upsert(context, data_dict) result.pop('id', None) result.pop('connection_url') return result
def datastore_upsert(context, data_dict): '''Updates or inserts into a table in the datastore :param resource_id: resource id that the data is going to be stored under. :type resource_id: string :param records: the data, eg: [{"dob": "2005", "some_stuff": ['a', b']}] :type records: list of dictionaries :param method: the method to use to put the data into the datastore possible options: upsert (default), insert, update :param upsert: update if record with same key already exists, otherwise insert :param insert: insert only, faster because checks are omitted :param update: update only, exception if key does not exist :type method: string :returns: the newly created data object. :rtype: dictionary ''' res_id = _get_or_bust(data_dict, 'resource_id') data_dict['connection_url'] = pylons.config['ckan.datastore.read_url'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''') results = db._get_engine(None, data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound(p.toolkit._( 'Resource "{0}" was not found.'.format(res_id) )) p.toolkit.check_access('datastore_upsert', context, data_dict) data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] result = db.upsert(context, data_dict) result.pop('id') result.pop('connection_url') return result
def datastore_upsert(context, data_dict): '''Updates or inserts into a table in the datastore :param resource_id: resource id that the data is going to be stored under. :type resource_id: string :param records: the data, eg: [{"dob": "2005", "some_stuff": ['a', b']}] :type records: list of dictionaries :param method: the method to use to put the data into the datastore possible options: upsert (default), insert, update :param upsert: update if record with same key already exists, otherwise insert :param insert: insert only, faster because checks are omitted :param update: update only, exception if key does not exist :type method: string :returns: the newly created data object. :rtype: dictionary ''' res_id = _get_or_bust(data_dict, 'resource_id') data_dict['connection_url'] = pylons.config['ckan.datastore.read_url'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''' ) results = db._get_engine(None, data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound( p.toolkit._('Resource "{0}" was not found.'.format(res_id))) p.toolkit.check_access('datastore_upsert', context, data_dict) data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] result = db.upsert(context, data_dict) result.pop('id') result.pop('connection_url') return result
def datastore_upsert(context, data_dict): '''Updates or inserts into a table in the DataStore The datastore_upsert API action allows you to add or edit records to an existing DataStore resource. In order for the *upsert* and *update* methods to work, a unique key has to be defined via the datastore_create action. The available methods are: *upsert* Update if record with same key already exists, otherwise insert. Requires unique key. *insert* Insert only. This method is faster that upsert, but will fail if any inserted record matches an existing one. Does *not* require a unique key. *update* Update only. An exception will occur if the key that should be updated does not exist. Requires unique key. :param resource_id: resource id that the data is going to be stored under. :type resource_id: string :param force: set to True to edit a read-only resource :type force: bool (optional, default: False) :param records: the data, eg: [{"dob": "2005", "some_stuff": ["a","b"]}] (optional) :type records: list of dictionaries :param method: the method to use to put the data into the datastore. Possible options are: upsert, insert, update (optional, default: upsert) :type method: string **Results:** :returns: The modified data object. :rtype: dictionary ''' schema = context.get('schema', dsschema.datastore_upsert_schema()) records = data_dict.pop('records', None) data_dict, errors = _validate(data_dict, schema, context) if records: data_dict['records'] = records if errors: raise p.toolkit.ValidationError(errors) p.toolkit.check_access('datastore_upsert', context, data_dict) if not data_dict.pop('force', False): resource_id = data_dict['resource_id'] _check_read_only(context, resource_id) data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] res_id = data_dict['resource_id'] resources_sql = sqlalchemy.text( u'SELECT 1 FROM "_table_metadata"' u' WHERE name = :id AND alias_of IS NULL' ) results = db._get_engine(data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound(p.toolkit._( u'Resource "{0}" was not found.'.format(res_id) )) result = db.upsert(context, data_dict) result.pop('id', None) result.pop('connection_url') return result