使用doctrine2的架构更新postgresql总是DROPs然后ADDs CONSTRAINTs

时间:2014-03-06 09:59:39

标签: postgresql symfony doctrine-orm doctrine-orm-postgres

更新架构时,doctrine总是会丢弃并添加约束。我想,这是错误的......

php app/console doctrine:schema:update --force
Updating database schema...
Database schema updated successfully! "112" queries were executed

php app/console doctrine:schema:update --dump-sql
ALTER TABLE table.managers DROP CONSTRAINT FK_677E81B7A76ED395;
ALTER TABLE table.managers ADD CONSTRAINT FK_677E81B7A76ED395 FOREIGN KEY (user_id) REFERENCES table."user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE;
...

php app/console doctrine:schema:validate
[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

在深入研究一下doctrine更新模式方法之后,我终于找到了一个问题。问题在于表名 - “table.order”和“table.user”。当学说制造差异时,由于内部逃逸(?),这个名称变得不相等。因此,“user”!= user,以及这些表(订单,用户)的外键总是重新创建。

解决方案#1 - 只需重命名表格以避免与postgresql关键字匹配,例如my_user,my_order。 解决方案#2 - 手动转义表名称。这不适合我,尝试了许多不同的逃避方式。

我已经应用了解决方案#1,现在我看到了:

  

无需更新 - 您的数据库已与当前数据库同步   实体元数据

答案 1 :(得分:1)

我在Postgres上遇到了一个带有where子句的uniqueConstraint的问题。

* @ORM \ Table(name =" avatar",
 * uniqueConstraints = {
 * @ORM \ UniqueConstraint(name =" const_name",columns = {" id_user"," status"},options = {"其中":"(状态='待定')"})

Doctrine正在比较元数据和新生成的模式中的模式,在索引比较期间,子句不匹配。

string(34) "((status)::text = 'pending'::text)"
string(20) "(status = 'pending')"

你只需要通过

改变你要匹配的子句
((avatar)::text = 'pending'::text)

PS:我的问题出在Postgres数据库

我希望这会对某人有所帮助。

答案 2 :(得分:0)

我遇到过这几次,这是因为php对象被更改了几次,但仍然与数据库的映射不匹配。基本上重启会解决问题,但实施起来可能很难。

如果删除数据库和php对象中的约束(删除doctrine2映射),则更新模式并确认不需要更新任何内容。然后将doctrine映射添加回php,使用--dump-sql更新模式并查看显示的更改。确认这正是您想要的并执行更新查询。现在更新架构不应该显示其他任何东西需要更新。