Django:关于自动增量主键的最佳实践

时间:2018-03-20 13:42:54

标签: python sql django

您好我正在构建一个Django应用程序,在此期间我正在测试上传到我的数据库,然后删除数据。据我所知,当我这样做时,下一个插入将在插入自动增量主键int时“拾取它停止的位置”。

即:

我在表'Sample'中插入3行:

auto_id    |     sample 
  1        |    JSUDH172
  2        |    QIUWJ185
  3        |    PNMSY111

当我删除这些并再次输入时,它将从4开始:

auto_id    |     sample 
  4        |    JSUDH172
  5        |    QIUWJ185
  6        |    PNMSY111

我知道这是为了阻止Django覆盖主键而内置的,但是当主键不再存在时,它(主要是从肤浅的角度来看)让我感到恼火,它不会重置。我在开发过程中将数千行上传到某些表中,因此有时它会以数百/数千的速度启动。

我知道在开发完成后我总是可以“从头开始”重新启动项目,但我想知道是否有人有任何有用的解决方法,或者是否有人将其保留原样(如果他们和我有相同的视图)< / p>

感谢

2 个答案:

答案 0 :(得分:0)

所以有一些方法。其中一些已经提到过。首先,重要的是要知道。虽然在django模型字段上设置了auto_increment,但它会转换为数据库命令。当你运行

python3 manage.py migrate

对于具有auto_increment字段的模型,它在sql命令中执行,如this

删除数据时,请进入sql cli并重置manually。但是,以非程序方式直接与数据库交互,不是django方式,不应该这样做。在这种情况下,你必须删除所有数据并重置自动增量,让我们说生产,我会通过./manage.py makemigrations theappname --empty创建一个迁移脚本。并在迁移脚本中执行sql语句。

答案 1 :(得分:0)

通常,整数主键的值基于数据库[1] [2]中的基础sequence,它允许以在所有多事务下安全的方式分配唯一值,多租户,多连接的racey荣耀,这是一个客户端 - 服务器数据库。安全地填充稀疏填充的ID序列中的间隙比“获取和增加”要复杂得多,并且对于约束功能而非美学的列没有任何实际价值。

从实际角度来看,几乎在所有情况下都不会耗尽整数主键,因此实际上不需要重复使用空闲插槽。

如果您需要一个从零平滑填充的序列号,也许您可​​以为此目的使用另一列并使其由另一种机制填充,可能使用存储过程来查找与新行一起使用的最小可用值

[1] https://www.postgresql.org/docs/10/static/sql-createsequence.html

[2] https://www.postgresql.org/docs/10/static/functions-sequence.html