【问题标题】:Importing user (Key (email)=() already exists)导入用户(密钥(电子邮件)=()已存在)
【发布时间】:2014-09-01 14:16:58
【问题描述】:

我正在尝试从 cvs 文件导入用户。有些没有电子邮件,这导致了一些问题。

我使用 Django 1.6 和标准用户。

这是我在尝试导入没有电子邮件的用户时遇到的错误:

IntegrityError('duplicate key value violates unique constraint "account_emailaddress_email_key"\nDETAIL: Key (email)=() already exists.\n',)

Traceback (most recent call last):
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/celery/app/trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/celery/app/trace.py", line 437, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/<USER>/.virtualenvs/<SITE>/<PROJECT>/apps/accounts/tasks.py", line 1151, in import_users_from_cvs
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/manager.py", line 154, in get_or_create
    return self.get_queryset().get_or_create(**kwargs)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/query.py", line 391, in get_or_create
    six.reraise(*exc_info)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/query.py", line 383, in get_or_create
    obj.save(force_insert=True, using=self.db)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/base.py", line 545, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/base.py", line 573, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/base.py", line 654, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/base.py", line 687, in _do_insert
    using=using, raw=raw)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/manager.py", line 232, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/query.py", line 1514, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 903, in execute_sql
    cursor.execute(sql, params)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/backends/util.py", line 69, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/<USER>/.virtualenvs/<SITE>/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
IntegrityError: duplicate key value violates unique constraint "account_emailaddress_email_key"
DETAIL:  Key (email)=() already exists.

这是数据库结构:

test_db=# \d+ account_emailaddress;
                                              Table "public.account_emailaddress"
  Column  |         Type          |                             Modifiers                             | Storage  | Description 
----------+-----------------------+-------------------------------------------------------------------+----------+-------------
 id       | integer               | not null default nextval('account_emailaddress_id_seq'::regclass) | plain    | 
 user_id  | integer               | not null                                                          | plain    | 
 email    | character varying(75) | not null                                                          | extended | 
 verified | boolean               | not null                                                          | plain    | 
 primary  | boolean               | not null                                                          | plain    | 
Indexes:
    "account_emailaddress_pkey" PRIMARY KEY, btree (id)
    "account_emailaddress_email_key" UNIQUE CONSTRAINT, btree (email)
    "account_emailaddress_email_like" btree (email varchar_pattern_ops)
    "account_emailaddress_user_id" btree (user_id)
Foreign-key constraints:
    "account_emailaddress_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
Referenced by:
    TABLE "account_emailconfirmation" CONSTRAINT "account_emailconfirmation_email_address_id_fkey" FOREIGN KEY (email_address_id) REFERENCES account_emailaddress(id) DEFERRABLE INITIALLY DEFERRED
Has OIDs: no

我可以做些什么来解决这个问题吗?

编辑:

我可以为每个用户生成一个随机的电子邮件地址,但我仍然收到错误

IntegrityError('duplicate key value violates unique constraint "account_emailaddress_email_key"\nDETAIL: Key (email)=() already exists.\n',)

有没有办法“重启”account_emailaddress_email_key

【问题讨论】:

    标签: django postgresql django-allauth


    【解决方案1】:

    您似乎没有使用标准的 Django auth.User 来存储这些电子邮件地址 (The email field of the standard django.contrib.auth.User is optional)。 您使用单独的表来存储用户的电子邮件(account_emailaddress)。

    当被处理的用户没有电子邮件地址时,您不应尝试添加电子邮件条目(在此 account_emailaddress 表中)。由于 account_emailaddress.email 列的唯一性约束,Postgres 会针对您尝试创建的第二个空电子邮件向您发送 IntegrityError。

    【讨论】:

      【解决方案2】:

      您可以创建一个 CustomUser 类:https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#django.contrib.auth.models.CustomUser.USERNAME_FIELD

      然后将 USERNAME_FIELD 更改为必须在用户之间唯一的字段,在您的情况下,“电子邮件”不是其中之一:)

      【讨论】:

        猜你喜欢
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 2013-09-29
        • 2016-05-26
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多