编程语言
首页 > 编程语言> > 我如何使用python防止rethinkdb上的重复记录

我如何使用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