mysql 加载Django设备时出现问题:完整性错误:(1062,“关键字'user_id'的条目'4'重复”)

dzhpxtsq  于 2022-10-31  发布在  Mysql
关注(0)|答案(2)|浏览(164)

我使用以下命令生成了两个装置:

  1. ./manage.py dumpdata --format=json --indent=4 --natural auth.User > fixtures/user.json
  2. ./manage.py dumpdata --format=json --indent=4 --natural --exclude=contenttypes --exclude=auth > fixtures/full.json

我有以下名为user.json的固定设备:

  1. [
  2. {
  3. "pk": 4,
  4. "model": "auth.user",
  5. "fields": {
  6. "username": "foo",
  7. "first_name": "Se\u00e1n",
  8. "last_name": "Hayes",
  9. "is_active": true,
  10. "is_superuser": true,
  11. "is_staff": true,
  12. "last_login": "2010-09-27 21:57:45",
  13. "groups": [],
  14. "user_permissions": [],
  15. "password": "!",
  16. "email": "foo@gmail.com",
  17. "date_joined": "2010-09-27 21:57:45"
  18. }
  19. }
  20. ]

和以下名为full.json的固定设备:

  1. [
  2. {
  3. "pk": "72a75887b4a0ce06a61f9183fe1c0e15",
  4. "model": "sessions.session",
  5. "fields": {
  6. "expire_date": "2010-10-11 21:57:45",
  7. "session_data": "gAJ9cQEoVRJfYXV0aF91c2VyX2JhY2tlbmRxAlUOZmIuYXV0aC5GYkF1dGhxA1UNX2F1dGhfdXNl\ncl9pZHEEigEEdS5hOGZlODU0MmRjYmUwNmEzODIwNjhiYzYyODc2MWQxZA==\n"
  8. }
  9. },
  10. {
  11. "pk": 1,
  12. "model": "sites.site",
  13. "fields": {
  14. "domain": "example.com",
  15. "name": "example.com"
  16. }
  17. },
  18. {
  19. "pk": 2,
  20. "model": "common.userprofile",
  21. "fields": {
  22. "money": 10,
  23. "energy": 10,
  24. "experience": 0,
  25. "stamina": 10,
  26. "health": 10,
  27. "user": 4
  28. }
  29. },
  30. {
  31. "pk": 2,
  32. "model": "missions.missionprofile",
  33. "fields": {
  34. "user": 4,
  35. "last_area_viewed": null
  36. }
  37. },
  38. {
  39. "pk": 1,
  40. "model": "fb.facebookuser",
  41. "fields": {
  42. "updated": "2010-09-27 21:57:45",
  43. "uid": "24411841",
  44. "created": "2010-09-27 21:57:45",
  45. "access_token": "foo",
  46. "url": "http://www.facebook.com/profile.php?id=24411841",
  47. "user": 4,
  48. "img_url": null,
  49. "name": "Se\u00e1n Hayes"
  50. }
  51. }
  52. ]

运行以下命令(按任意顺序):

  1. ./manage.py loaddata user
  2. ./manage.py loaddata full

会引发下列例外状况:

  1. Problem installing fixture '/projectpath/fixtures/full.json': Traceback (most recent call last):
  2. File "/usr/lib/pymodules/python2.6/django/core/management/commands/loaddata.py", line 169, in handle
  3. obj.save(using=using)
  4. File "/usr/lib/pymodules/python2.6/django/core/serializers/base.py", line 165, in save
  5. models.Model.save_base(self.object, using=using, raw=True)
  6. File "/usr/lib/pymodules/python2.6/django/db/models/base.py", line 528, in save_base
  7. result = manager._insert(values, return_id=update_pk, using=using)
  8. File "/usr/lib/pymodules/python2.6/django/db/models/manager.py", line 195, in _insert
  9. return insert_query(self.model, values,**kwargs)
  10. File "/usr/lib/pymodules/python2.6/django/db/models/query.py", line 1479, in insert_query
  11. return query.get_compiler(using=using).execute_sql(return_id)
  12. File "/usr/lib/pymodules/python2.6/django/db/models/sql/compiler.py", line 783, in execute_sql
  13. cursor = super(SQLInsertCompiler, self).execute_sql(None)
  14. File "/usr/lib/pymodules/python2.6/django/db/models/sql/compiler.py", line 727, in execute_sql
  15. cursor.execute(sql, params)
  16. File "/usr/lib/pymodules/python2.6/django/db/backends/util.py", line 15, in execute
  17. return self.cursor.execute(sql, params)
  18. File "/usr/lib/pymodules/python2.6/django/db/backends/mysql/base.py", line 86, in execute
  19. return self.cursor.execute(query, args)
  20. File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute
  21. self.errorhandler(self, exc, value)
  22. File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler
  23. raise errorclass, errorvalue
  24. IntegrityError: (1062, "Duplicate entry '4' for key 'user_id'")

我知道MySQL中的前向引用有问题,但是如果id为4的User对象安装在包含外键的fixture之前,这应该没关系,对吧?

qkf9rpyu

qkf9rpyu1#

根据Ashok的评论,当我遇到同样的问题时,通过更改我的信号处理程序来检查它是否在“原始”模式下运行(这显然意味着正在加载一个fixture),这个问题得到了解决:

  1. def create_user_profile(sender, instance, created,**kwargs):
  2. if created and not kwargs.get('raw', False):
  3. UserProfile.objects.create(user=instance)

请参阅How do I prevent fixtures from conflicting with django post_save signal code?

yrefmtwq

yrefmtwq2#

Django的静态fixture是一个反模式,这就是你遇到这种问题的原因。我建议你使用一些库来为你生成这些fixture,自然包括ID。
我建议你

相关问题