给定:Connection为Safe = True,因此Update的返回将包含更新信息.
说我有一个看起来像这样的文件:
[{'a': [1]}, {'a': [2]}, {'a': [1,2]}]
Run Code Online (Sandbox Code Playgroud)
我发出:
coll.update({}, {'$addToSet': {'a':1}}, multi=True)
Run Code Online (Sandbox Code Playgroud)
结果将是:
{u'connectionId': 28,
u'err': None,
u'n': 3,
u'ok': 1.0,
u'updatedExisting': True
}
Run Code Online (Sandbox Code Playgroud)
即使来文件已经有了这个价值.为了避免这种情况,我可以发出命令.
coll.update({'a': {'$ne': 1}}, {'$push': {'a':1}}, multi=True)
Run Code Online (Sandbox Code Playgroud)
$ addToSet与$ push的时间复杂度比较是什么?
我必须每小时在表中插入大量日志记录,我不会关心在此过程中发生的完整性错误或违规。
如果我禁用 autoCommit 并执行批量插入,则游标不会插入事务失败行以外的任何内容。有没有办法解决这个问题?
一种技巧是在应用程序级别处理此问题。我可以实现一个 n 大小的缓冲区并进行批量插入。如果该事务中的某些内容失败,则递归地为 buffer_first_half + buffer_second_half 重复插入
def insert(buffer):
try:
bulk_insert(buffer)
except:
connection.rollback()
marker = len(buffer)/2
insert(buffer[:marker])
insert(buffer[marker:])
Run Code Online (Sandbox Code Playgroud)
但我真的希望是否可以使用任何 Postgres 的内置功能来实现?