5

更新模式时,学说总是删除并添加约束。我想,有什么不对...

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.

如何解决这个问题?

4

3 回答 3

2

在深入研究了学说更新模式方法之后,我终于发现了一个问题。问题在于表名 - “table.order”和“table.user”。当学说产生差异时,这些名称变得不相等,因为内部转义(?)。因此,“用户”!= 用户,这些表(订单、用户)的外键总是重新创建。

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

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

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

于 2014-09-01T08:04:38.097 回答
1

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

*@ORM\Table(name="avatar",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="const_name", columns={"id_user", "status"}, options={"where": "(status = 'pending ')"})

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

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

你只需要改变你的 where 子句来匹配

((avatar)::text = 'pending'::text)

PS:我的问题是 Postgres 数据库

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

于 2016-11-16T08:48:41.907 回答
0

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

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

于 2014-04-07T17:58:20.010 回答