Django South和Constraint ID

时间:2014-01-10 21:40:15

标签: django postgresql django-south database-migration

在创建唯一和外键约束时,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,

我一直在遇到的问题是迁移尝试删除约束,但数据库中的实际约束是不同的。

  1. 这个哈希是由South本身生成的,还是来自数据库?
  2. 这个哈希基于什么?
  3. 使用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
    

    这是南方试图删除的禁令:

    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位版本的哈希值?

    南版0.8.4 - 我在一个全新的空白数据库上运行它。 Django版本1.4.2

1 个答案:

答案 0 :(得分:0)

问题是:南方总是在public模式中查找约束名称,并且迁移正在public以外的模式中应用。因此不匹配。