Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中获取Riak对象、更改其值并将其与所有索引一起存储回去_Python_Database_Riak - Fatal编程技术网

如何在Python中获取Riak对象、更改其值并将其与所有索引一起存储回去

如何在Python中获取Riak对象、更改其值并将其与所有索引一起存储回去,python,database,riak,Python,Database,Riak,我使用Riak数据库来存储由多个脚本并行使用和处理的Python应用程序对象。因此,我需要将它们锁定在不同的位置,以避免同时被多个脚本处理,如下所示: riak_bucket = riak_connect('clusters') cluster = riak_bucket.get(job_uuid).get_data() cluster['status'] = 'locked' riak_obj = riak_bucket.new(job_uuid, data=cluster) riak_obj

我使用Riak数据库来存储由多个脚本并行使用和处理的Python应用程序对象。因此,我需要将它们锁定在不同的位置,以避免同时被多个脚本处理,如下所示:

riak_bucket = riak_connect('clusters')
cluster = riak_bucket.get(job_uuid).get_data()
cluster['status'] = 'locked'
riak_obj = riak_bucket.new(job_uuid, data=cluster)
riak_obj.add_index('username_bin', cluster['username'])
riak_obj.add_index('hostname_bin', cluster['hostname'])
riak_obj.store()
问题是,要做一件简单、可重复的事情,这需要相当多的代码,考虑到锁定经常发生,我想找到一种更简单、更干净的方法。我曾尝试编写一个函数来执行锁定/解锁,就像这样(对于另一个对象,称为“build”):

但是由于对象之间显然有很大的不同,它们有不同的索引等等,我最终为每个对象编写了一个锁定函数。。。这几乎和根本没有函数并重复代码一样混乱


问题是:如果知道每个对象都有一个“status”字段,该字段将它们锁定在db中,并保留所有索引和其他属性,那么有没有办法编写一个通用函数来实现这一点?或者,也许还有另一种更简单的方法我还没有想到?

经过更多的研究,在各种IRC渠道上提出的问题看来,这是不可行的,因为无法从Riak获取关于对象的此类元数据。

经过更多的研究,在各种IRC渠道上提出的问题似乎不可行,因为无法从Riak获取关于对象的此类元数据

def build_job_locker(uuid, status='locked'):
    riak_bucket = riak_connect('builds')
    build = riak_bucket.get(uuid).get_data()
    build['status'] = status
    riak_obj = riak_bucket.new(build['uuid'], data=build)
    riak_obj.add_index('cluster_uuid_bin', build['cluster_uuid'])
    riak_obj.add_index('username_bin', build['username'])
    riak_obj.store()
    # when locking, return the locked db object to avoid fetching it again
    if 'locked' in status:
        return build
    else:
        return