使用Doctrine2 PostgreSQL的模式更新始终下降,然后添加约束



更新架构时,学说总是会删除并添加约束。我认为这是错误的...

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.

如何修复?

挖掘一些学说更新模式方法后,我终于找到了一个问题。问题在于表名 - " table.order"one_answers" table.user"。当教义使差异差时,由于内部逃脱(?),此名称变得非平等。因此,"用户"!=用户,以及这些表(订单,用户)总是重新创建的外键。

解决方案#1 - 仅重命名表即可避免与PostgreSQL关键字匹配的名称,例如my_user,my_order。解决方案#2 - 手动逃脱表名称。这对我不起作用,尝试了许多不同的逃脱方式。

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

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

我在postgres上遇到了同样的问题,带有where子句。

* @orm table(name =" avatar",
* iniqueConstraints = {
* @orm iniqueConstraint(name =" const_name",columns = {" id_user"," status"},options = {" where":":"(status ='pending'})

学说正在比较元数据和新生成的模式的模式,在索引比较中,其中条款不匹配。

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

您只需要更改您的条款以

匹配的条款
((avatar)::text = 'pending'::text)

ps:我的问题是Postgres数据库

我希望这对某人有帮助。

我已经遇到了几次,这是因为PHP对象几次更改了几次,并且仍然与映射不匹配数据库。基本上,重新启动将解决该问题,但实施可能很难。

如果将约束放在数据库和PHP对象中(删除Doctrine2映射),则更新模式并确认无需更新。然后将学说映射添加回PHP,使用-Dump-SQL更新架构,然后查看所显示的更改。确认这正是您想要的,并执行更新查询。现在更新模式不应显示需要更新其他内容。

相关内容

最新更新