【发布时间】:2016-02-18 06:06:18
【问题描述】:
我想在 Aerospike 中插入一些记录,如果记录已经存在,那么我只想更新它。 目前我正在使用这个查询(插入)-
client.put(wPolicy, key,bin1,bin2)
有人可以告诉我如何根据记录是否重复来更新或插入吗?
【问题讨论】:
我想在 Aerospike 中插入一些记录,如果记录已经存在,那么我只想更新它。 目前我正在使用这个查询(插入)-
client.put(wPolicy, key,bin1,bin2)
有人可以告诉我如何根据记录是否重复来更新或插入吗?
【问题讨论】:
使用默认写入策略,它执行以下操作:
(1) 如果指定的 bin 尚不存在,则将其插入;和
(2) 如果指定的 bin 存在且有值,则这些值将被替换。
要使用默认写入策略,如果您使用的是 Java 客户端,只需将 null 传递给 writePolicy 参数即可。我怀疑其他客户也会类似。
如果您的问题有更多子部分,您可以在问题中添加详细信息,稍后我会重新讨论。
【讨论】:
正如Aaron 提到的,存在的默认write policy 是AS_POLICY_EXISTS_IGNORE,这意味着“写入记录,无论是否存在。(即创建或更新。)”。因此,您不必显式设置存在策略,因为它已经按照您的预期进行。
您可以选择具有更类似于 SQL 的行为,AS_POLICY_EXISTS_CREATE(如果记录已存在则写入失败)、AS_POLICY_EXISTS_UPDATE(如果记录不存在则写入失败)和AS_POLICY_EXISTS_REPLACE(如果记录不存在则写入失败,并且您编写的内容总是完全替换以前的版本)和AS_POLICY_EXISTS_CREATE-OR-REPLACE(如果不存在则创建新记录,或者如果存在则完全覆盖记录)。
在Python client 中,您可以在aerospike.Client.put() 上设置这些替代存在写入策略之一:
from __future__ import print_function
import aerospike
from aerospike.exception import RecordError
config = {
'hosts': [ ('127.0.0.1', 3000) ],
'timeout': 1500
}
client = aerospike.client(config).connect()
try:
key = ('test', 'users', 1)
bins = {
'username': 'ninjastar',
'age': 47,
'hp': 1234
}
client.put(key, bins,
policy={'exists': aerospike.POLICY_EXISTS_CREATE},
meta={'ttl': 3600})
except RecordError as e:
print("The user record already exists: {0} [{1}]".format(e.msg, e.code))
sys.exit(1)
finally:
client.close()
exists 的可能值是aerospike.POLICY_EXISTS_*。
【讨论】: