我如何使用python防止rethinkdb上的重复记录
作者:互联网
我只想在以前没有记录的情况下将记录插入到表中,例如我有一个表用户,而我只想添加具有电话号码的唯一用户
{"name":"john smith", "Age":30 , "phone_number": "556"}
如果要添加另一个具有相同电话号码的用户,我将无法添加它们.现在,我正在尝试使用过滤器来确定我是否已有该电话号码的记录
r.db(DB).table('users').filter(
{'phone_number': new_practice['phone_number']},
default=r.error()).run(conn)
这就是我尝试使用该方法查找用户是否存在的方式,但这似乎并没有给我我想要的东西
解决方法:
RethinkDB没有安全的方法可以很好地做到这一点.在issue on github中已对此进行了讨论,并且与唯一的二级索引以及保证原子性有关.本质上,您必须执行两个操作.首先搜索以查看电话号码是否已经存在,然后添加记录(如果没有).
RethinkDB does not support unique secondary indexes even for
non-sharded tables. (Source: 07001)
所以我们有一个竞争条件.可以同时运行两个请求,两个请求都返回电话号码不存在,然后最终都插入新记录.以下不安全代码将执行此操作:
new_record = {"name": "john smith", "Age": 30, "phone_number": "556"}
filter_predicate = {"phone_number": new_record["phone_number"]}
test = r.table('users').filter(filter_predicate).count().eq(0)
r.branch(test, r.table('users').insert(new_record), None).run()
这是运行它的输出:
In [92]: for document in r.table('users').run(): print(document)
In [93]: new_record = {"name": "john smith", "Age": 30, "phone_number": "556"}
In [94]: filter_predicate = {"phone_number": new_record["phone_number"]}
In [95]: test = r.table('users').filter(filter_predicate).count().eq(0)
In [96]: r.branch(test, r.table('users').insert(new_record), None).run()
Out[96]:
{u'deleted': 0,
u'errors': 0,
u'generated_keys': [u'2c0ffb27-cfdb-44e7-a416-4f7be5d97ea9'],
u'inserted': 1,
u'replaced': 0,
u'skipped': 0,
u'unchanged': 0}
In [97]: for document in r.table('users').run(): print document
{u'phone_number': u'556', u'Age': 30, u'id': u'2c0ffb27-cfdb-44e7-a416-4f7be5d97ea9', u'name': u'john smith'}
In [98]: r.branch(test, r.table('users').insert(new_record), None).run()
In [99]: for document in r.table('users').run(): print document
{u'phone_number': u'556', u'Age': 30, u'id': u'2c0ffb27-cfdb-44e7-a416-4f7be5d97ea9', u'name': u'john smith'}
我想到的一种变通方法是尝试正常地失败.也就是说,我们进行初始检查以查看文档是否存在,如果不是,我们添加它.然后,我们必须检查重复项.并清理是否发现重复项.我们需要某种平局,例如在插入文档时(最早的是赢家).希望我们的文档具有唯一电话号码的任何查询也需要考虑到这一点.如果两个文档的电话号码顺序按时间升序排列,请选择第一个.
标签:rethinkdb,python 来源: https://codeday.me/bug/20191027/1946572.html