Aks*_*aaj 4 database django transactions
我有一个Django应用程序.
这个Django应用程序向Twitter发出api调用并得到我最近的100条推文.我需要将推文插入数据库.
我有一种方法可以对所有100条推文采取行动.这个方法有一个for循环,我在每个Tweet中创建一个模型实例,并分别在每个实例上调用instance.save().
我发现事情变慢了,并认为交易可能会让事情变得更快.
所以在我添加的方法之外@method_decorator(transaction.atomic).我仍然有一个for循环,我创建了模型实例并执行了instance.save(),但现在该方法用transaction.atomic修饰.
在原子事务中,一系列数据库操作全部发生,或者什么都不发生.
装饰方法atomic将保证数据库中该方法中的代码块的原子性.如果方法成功完成,则将更改提交到数据库.如果存在异常,则回滚更改.
1.根据您的使用情况,交易不会使您的代码更快.事实上,它只是保证将所有的tweets内容保存到数据库中,或者tweets在异常的情况下不保存任何内容.
是的,每次instance.save()通话都是数据库通话.因此,每次都会有100个数据库调用.
3.同样,交易不会使您的用例更快.
如何让事情更快呢?
您可以使用Django 在单个查询中bulk_create创建所有内容tweets.
Tweet.objects.bulk_create([tweet1, tweet2, ...., tweet100]) # single query
Run Code Online (Sandbox Code Playgroud)
这tweet仅在1个查询中以有效的方式将对象列表插入到数据库中.