【发布时间】:2010-01-18 18:21:46
【问题描述】:
我有一个导入脚本,它运行一系列命令以将内容从一个 Postgres DB 获取到另一个,两者都运行相同的 Django 代码库。在大多数情况下,它使用 ./manage.py loaddata 进行复制,但有些对象需要额外处理,我在自定义脚本中使用 Django 的 objects.create() 方法来复制数据。执行此操作时,我指定 ID,即
MyObject.objects.create(id = 2, title = 'foo')
脚本完成后,我注意到 Postgres SEQUENCE 在我执行 objects.create() 的表上是错误的。即,导入前是 50,导入后仍然是 50,即使表现在有 150 个对象。当然,这会在创建新对象时导致错误,因为它会尝试使用已经存在的 ID(在所有这些表中,ID 只是一个普通的自动增量字段)。但是,通过 ./manage.py loaddata 填充的表看起来还不错。
我知道我可以使用 Django 的 ./manage.py sqlsequenreset 手动重置这些表,但我很好奇为什么序列似乎一开始就失控了。 objects.create() 不会增加它吗?我是否忽略了一些明显的东西?
【问题讨论】:
-
没有更好的方法来同步数据库吗?您是否检查了关于 id 字段中的自动增量的表结构?
-
我不是最新的 postgres 特定的东西,但我的猜测是,每当插入带有
null标识列的行时,它都会被 postgres“填充”( a la auto_increment) 并且序列递增。如果你自己指定一个id,它会绕过这个逻辑,直接插入行。我猜,django 并没有尝试实际增加序列号,而是将其留给数据库引擎。 -
@shylent 我在这里也很凭直觉,但似乎在数据库中增加一个序列变量的目的是避免必须在每个记录的每个记录上运行一个最大值未指定 id 时插入。为了在 OP 的用例中保持序列是最新的,当指定 id 时,必须在每次插入之后运行一个最大值。我认为要求用户手动请求刷新是合理的。
标签: django postgresql