【问题标题】:Python/ Django Key already exists. PostgresPython/ Django 密钥已经存在。 Postgres
【发布时间】:2017-06-14 10:45:55
【问题描述】:

我有一个用 django 构建的项目,它使用 postgres 数据库。 该数据库由 CSV 文件填充。所以当我想插入一个新对象时,我得到了错误“重复键”,因为 id = 1 的对象已经存在。

代码:

user = User(name= "Foo")
user.save()

表 users 在 id 上有 PK。

Indexes:
    "users_pkey" PRIMARY KEY, btree (id)

如果我在 psql 中得到表的详细信息,我得到:

Column| Type    |  Modifiers                          
------+-------- +--------------------------------------
id    | integer | not null default nextval('users_id_seq'::regclass)

另外,如果我在创建变量 user 之后保存它之前执行 user.dict,我会得到 'id': None

如何使用未使用的 id 保存用户?

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    您很可能从 CSV 中插入了您的用户,并明确设置了 id 值,当这种情况发生时,postgres 序列不会更新,因此当您尝试添加新用户时,该序列会生成一个已使用的值

    查看其他问题以供参考postgres autoincrement not updated on explicit id inserts

    解决方案就是该问题的答案,手动更新您的序列

    【讨论】:

      【解决方案2】:

      您可以通过手动设置 users_id_seq 来修复它。

      SELECT setval('users_id_seq', (SELECT MAX(id) from "users"));
      

      【讨论】:

        【解决方案3】:

        除非您将名称作为表的主键,否则上述插入应该可以工作。如果您有 name 作为主键,请将其删除并尝试。

        【讨论】:

        • 不,PK是id。索引:“users_pkey” PRIMARY KEY, btree (id)。
        【解决方案4】:

        在 Postgres SQL 中,您可以将 id 指定为序列,并且可以将其标记为主键。然后,无论何时插入记录,它都会按顺序排列。 即 id serial NOT NULL 和 CONSTRAINT primkey PRIMARY KEY (id)。

        正如你所说,它是由 CSV 预先填充的,所以当你从 python 代码插入它时,它会自动进入表的末尾,并且不会有重复的值。

        【讨论】:

        • id 设置为serial 看看描述,我更新了问题并把psql 说的关于表的内容放了
        • 使用 cursor.lastrowid 获取插入游标对象的最后一行 ID,或使用 connection.insert_id() 获取该连接上最后插入的 ID。
        猜你喜欢
        • 1970-01-01
        • 2022-01-14
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 2016-12-25
        • 2011-03-06
        相关资源
        最近更新 更多