【发布时间】:2014-01-30 01:13:08
【问题描述】:
在创建唯一和外键约束时,South 是如何得出约束名称的 ID,例如:
CONSTRAINT report_type_id_refs_id_435782e833badd2f FOREIGN KEY (report_type_id)
REFERENCES reports_reporttype (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
我一直遇到的问题是迁移尝试删除约束,但数据库中的实际约束不同。
- 这个哈希是由 South 自己生成的,还是来自数据库?
- 此哈希基于什么?
使用 PostgreSQL 作为数据库。
更新:我注意到不匹配并不是随机的。以下是数据库的内容:
CONSTRAINT user_id_refs_id_f15cc3cd FOREIGN KEY (user_id)
REFERENCES brandnew4.auth_user (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
这是 South 试图删除的约束:
django.db.utils.DatabaseError: constraint "user_id_refs_id_7e2ccc6bf15cc3cd" of relation "operatorInterface_ospreyuserprofile" does not exist
如果您仔细查看这些约束名称:
user_id_refs_id_f15cc3cd
user_id_refs_id_7e2ccc6bf15cc3cd
db 中的 8 位十六进制密钥与 South 正在寻找的 16 位 十六进制密钥的最后 8 位相同。
发生了什么事?
更新 2: 我跟踪了生成哈希的位置:https://github.com/django/django/commit/e4ea53677449cfc56a0093bfbd92cb482020bb1e
为什么 South 在一次迁移中使用 64 位版本的哈希,而在另一次迁移中使用 32 位版本的哈希?
South 版本 0.8.4 - 我在一个全新的空白数据库上运行它。 Django 1.4.2 版
【问题讨论】:
标签: django postgresql django-south database-migration