【发布时间】:2014-10-30 13:45:42
【问题描述】:
我正在使用 django 1.6,mysql 5.6 作为带有 innodb 表的数据库。 Debug 在我的设置文件中设置为 false。
在一个脚本中,我循环遍历一个元素列表,检查它是否已经存在于db中,如果不存在则创建,如下:
for item in list:
try:
MyModel.objects.get(field=item)
except MyModel.DoesNotExist:
MyModel.objects.create(field=item)
我希望只有当它不存在时才会在数据库中创建一个项目,但这种方法会创建具有相同字段值的多个项目。这里似乎有某种缓存。
这里有两个问题;
如何更改此行为,以便在每次循环运行时检查数据库的最新状态是否存在?
这种行为是否与我通过脚本运行有关?如果相同的循环将在视图中运行。行为会有什么不同吗?
编辑:
我已经通过类似问题的建议将事务隔离更改为 READ-COMMITTED 。这会导致常规 Django 视图操作的性能下降吗?
【问题讨论】:
-
事务应该不是问题,除非你的数据库在别处被修改,你能发布你的模型定义和你的“项目”类型吗?
-
围绕你的 sn-p 的一些更完整的代码可能会有所帮助。这是在
transaction.atomic()内运行吗? (另外,如果您只想为每个field=item设置一个,您可能应该让field唯一。)
标签: django caching django-models race-condition