如何在Python中获取Riak对象、更改其值并将其与所有索引一起存储回去
我使用Riak数据库来存储由多个脚本并行使用和处理的Python应用程序对象。因此,我需要将它们锁定在不同的位置,以避免同时被多个脚本处理,如下所示:如何在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_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