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`))
为什么会这样?有解决办法吗?
您的问题是您想要修改具有现有约束的 table。我看到两个解决方案:
如果你在开发中,你可以重建你的数据库
doctrine:database:drop --force
doctrine:database:create
doctrine:schema:create
如果你在生产中,它会稍微复杂一些。
我看到的一个解决方案是您可以创建一个命令来保存您的数据,删除您想要更改的 table 中的数据,修改您的模式,一旦您的 table 被改变。根据变化,应该不会超过 2-3 小时。只要确保你有备份,以防你的命令失败。
@maxian
Michael Villeneuve 的回答并不完全正确。在生产环境或类似的情况下,您不能删除架构并重新创建它。
在您当前的架构上执行它的唯一方法是通过以下方式:
- php app/console doctrine:schema:update --dump-sql 。复制输出。它是直接 SQL 查询来更新您的架构
- 使用mysql命令行或通过mysql客户端连接mysql
- 通过调用此查询禁用外键检查:"set foreign_key_checks=0;"
- 输入来自 doctrine:schema:update
的查询
- 启用后向外键检查:
"set foreign_key_checks=1;"
我不能保证您不会丢失一些密钥,但您根本不会丢失数据。
禁用外键检查的模式更新
如果 Doctrine 模式更新由于外键约束而失败,您只需要为此特定更新禁用外键检查。
作为单线,您可以 运行:
mysql -e "set foreign_key_checks = 0; `app/console doctrine:schema:update --dump-sql`"
这将 set foreign_key_checks = 0;
添加到 app/console doctrine:schema:update --dump-sql
的输出,因此它实际上调用了 Doctrine 将调用的内容,但禁用了外键检查。根据您的需要配置 mysql
调用。
您的架构已更新,根据您的更改,不会丢失任何数据。
请记住,有时查询的顺序很重要,而 Doctrine 根本没有对它们进行正确排序。在这种情况下,您必须自己对查询进行正确排序,然后改用排序后的查询列表。
对我来说,它适用于以下设置(有两个关系)。诀窍是不要混淆 mappedBy
和 inversedBy
.
/**
* @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;
}
您需要在新table中添加与字段相关的值。
例如:如果您有 table A 和 B,并且 B 具有 A 的键 (a_id),那么您需要在 A 中添加一个 id = 1 的字段,并在在这种情况下,table B a_id 需要更改为 A table - 1 的值(对所有字段都这样做)。
之后 运行 :
php app/console doctrine:schema:update --force
此致
我在本地机器上创建了数据库。将我的项目移动到服务器后,我从本地导入了备份(因为我在那里有一些重要数据)。
现在,当我尝试更新我的服务器上的架构时,它会给出以下输出:
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`))
为什么会这样?有解决办法吗?
您的问题是您想要修改具有现有约束的 table。我看到两个解决方案:
如果你在开发中,你可以重建你的数据库
doctrine:database:drop --force
doctrine:database:create
doctrine:schema:create
如果你在生产中,它会稍微复杂一些。
我看到的一个解决方案是您可以创建一个命令来保存您的数据,删除您想要更改的 table 中的数据,修改您的模式,一旦您的 table 被改变。根据变化,应该不会超过 2-3 小时。只要确保你有备份,以防你的命令失败。
@maxian
Michael Villeneuve 的回答并不完全正确。在生产环境或类似的情况下,您不能删除架构并重新创建它。
在您当前的架构上执行它的唯一方法是通过以下方式:
- php app/console doctrine:schema:update --dump-sql 。复制输出。它是直接 SQL 查询来更新您的架构
- 使用mysql命令行或通过mysql客户端连接mysql
- 通过调用此查询禁用外键检查:"set foreign_key_checks=0;"
- 输入来自 doctrine:schema:update 的查询
- 启用后向外键检查: "set foreign_key_checks=1;"
我不能保证您不会丢失一些密钥,但您根本不会丢失数据。
禁用外键检查的模式更新
如果 Doctrine 模式更新由于外键约束而失败,您只需要为此特定更新禁用外键检查。
作为单线,您可以 运行:
mysql -e "set foreign_key_checks = 0; `app/console doctrine:schema:update --dump-sql`"
这将 set foreign_key_checks = 0;
添加到 app/console doctrine:schema:update --dump-sql
的输出,因此它实际上调用了 Doctrine 将调用的内容,但禁用了外键检查。根据您的需要配置 mysql
调用。
您的架构已更新,根据您的更改,不会丢失任何数据。
请记住,有时查询的顺序很重要,而 Doctrine 根本没有对它们进行正确排序。在这种情况下,您必须自己对查询进行正确排序,然后改用排序后的查询列表。
对我来说,它适用于以下设置(有两个关系)。诀窍是不要混淆 mappedBy
和 inversedBy
.
/**
* @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;
}
您需要在新table中添加与字段相关的值。
例如:如果您有 table A 和 B,并且 B 具有 A 的键 (a_id),那么您需要在 A 中添加一个 id = 1 的字段,并在在这种情况下,table B a_id 需要更改为 A table - 1 的值(对所有字段都这样做)。
之后 运行 : php app/console doctrine:schema:update --force
此致