繁体   English   中英

Symfony2 Doctrine架构更新失败

[英]Symfony2 Doctrine schema update fails

我在本地机器上创建了数据库。 将我的项目移动到服务器后,我从本地导入备份(因为那里有一些重要的数据)。

现在,当我尝试更新服务器上的架构时,它会给出我的输出:

php app/console doctrine:schema:update --force
Updating database schema...





  [Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException]                                                                                                             
  An exception occurred while executing 'ALTER TABLE golf_course ADD CONSTRAINT FK_EC96E162F1503E2B FOREIGN KEY (golf_id) REFERENCES golf (id)':                               
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9  
  6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))                                                                                                             






  [Doctrine\DBAL\Driver\PDOException]                                                                                                                                          
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9  
  6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))                                                                                                             






  [PDOException]                                                                                                                                                               
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9  
  6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))                                                                                                             

为什么会这样? 有解决方案吗?

@maxian

Michael Villeneuve的回答并不完全正确。 在生产环境或类型的情况下,您只能放弃架构并重新创建它。

在当前架构上执行它的唯一方法是通过以下方式:

  1. php app / console doctrine:schema:update --dump-sql。 复制ouptut。 它是用于更新架构的直接SQL查询
  2. 使用mysql命令行或通过mysql客户端连接mysql
  3. 通过调用此查询禁用外键检查:“set foreign_key_checks = 0;”
  4. 把来自doctrine的查询:schema:update
  5. 启用后退外键检查:“set foreign_key_checks = 1;”

我不能保证你不会丢失一些钥匙,但你根本不丢弃你的数据。

您的问题是您想要修改具有现有约束的表。 我看到两个解决方案:

如果您在dev中,则可以重建数据库

doctrine:database:drop --force
doctrine:database:create
doctrine:schema:create

如果你正在制作它会有点复杂。

我看到的一个解决方案是,您可以创建一个命令来保存数据,删除要更改的表中的数据,修改模式,在更改表后重新加载数据。 根据变化,不应超过2-3小时。 只要确保你有一个备份,以防你的命令向南。

禁用外键检查的架构更新

如果由于外键约束而导致Doctrine架构更新失败,则只需禁用此特定更新的外键检查。

作为一个单行程,您可以运行:

mysql -e "set foreign_key_checks = 0; `app/console doctrine:schema:update --dump-sql`"

这个prepends set foreign_key_checks = 0; app/console doctrine:schema:update --dump-sql的输出app/console doctrine:schema:update --dump-sql所以它实际上调用了Doctrine会调用的东西,但禁用了外键检查。 根据您的需要配置mysql调用。

您的架构已更新,并且根据您的更改,不会丢失任何数据。

请记住, 有时查询的顺序很重要,而且Doctrine根本没有对它们进行排序。 在这种情况下,您必须由您自己正确地排序查询,然后使用该有序查询列表。

您需要在新表中添加与该字段相关的值。

例如:如果您有表A和B,并且B具有A(a_id)的键,则需要在A中添加id = 1的字段,并且在表B中需要将a_id更改为表格 - 在这种情况下为1(对所有字段都这样)。

之后运行:php app / console doctrine:schema:update --force

问候

对我来说,它使用以下设置(有两个关系)。 诀窍是不要混淆mappedByinversedBy

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User extends BaseUser
{
    /**
     * @var Merchant
     *
     * @ORM\OneToOne(targetEntity="Merchant", mappedBy="user")
     */
    protected $merchant;

    /**
     * @var Client
     *
     * @ORM\OneToOne(targetEntity="Client", mappedBy="user")
     */
    protected $client;
}

/**
 * @ORM\Table(name="merchant")
 * @ORM\Entity
 */
class Merchant extends BaseEntity
{
    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="merchant")
     */
    protected $user;
}

/**
 * @ORM\Table(name="client")
 * @ORM\Entity
 */
class Client extends BaseEntity
{
    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="client")
     */
    protected $user;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM