【发布时间】:2012-05-11 16:57:23
【问题描述】:
我在使用 Django 的 get_or_create 时遇到了问题,我在一些帖子中看到了这个问题,已经解释了这是一个 MySQL 问题,所以我关注了这个帖子 http://www.no-ack.org/2010/07/mysql-transactions-and-django.html
这基本上是说get_or_create 将在并发创建对象时返回一个IntegrityError,因为 MySQL 的默认事务隔离为REPEATABLE READ。
我按照帖子的建议做了,将transaction-isolation = READ-COMMITTED 添加到我的
/etc/mysql/my.cnf 文件,但得到了同样的错误。所以我想知道是否还有其他解决方案。
这是一个复制问题的示例模型
class Author(models.Model):
name = models.CharField(max_length=100, unique=True)
class Book(models.Model):
name = models.CharField(max_length=100, unique=True)
author = models.ForeingKey(Author)
如果我有很长的作者和书籍清单,有些重复。我运行一个 forloop 来遍历每个作者/书,使用 get_or_create 创建或获取相应的对象,它会抛出一个 IntegrityError。
循环类似于..
authors = ['Author1', 'Author2', 'Author3', 'Author4', 'Author5']
books = ['book1', 'book2', 'book3', 'book4', 'book5']
for author, book in zip(authors, books):
author = Author.objects.get_or_create(name=author)[0]
author.book_set.get_or_create(name=book) # Error happens here
【问题讨论】:
-
你能把你在循环中使用的代码也显示出来吗?
-
我不确定当您执行
author.book_set.get_or_create(name=book)时会发生什么。我个人会更明确地这样做:Book.objects.get_or_create(name=book, defaults={'author':author})或类似的东西。你能发布你的确切错误吗?可能会有所帮助。