Doctrine架构更新总是尝试添加NOT NULL

时间:2017-03-01 16:24:29

标签: mysql symfony doctrine-orm dbal

我有一个新的Symfony 2.8安装,带有doctrine和MySQL 5.6堆栈。

执行doctrine:schema:update --force后,我可以看到
Database schema updated successfully! "x" queries were executed

这是我的问题:即使我多次执行它,学说也总能找到架构差异。

使用--dump-sql,我可以看到所有这些查询都与:

相关
  • 字符串主键
  • 上添加NOT NULL
  • 在datetime上添加NOT NULL 字段

但是,当我检查我的数据库时,这些列已经有一个NOT NULL。

以下是单个属性/列的示例:

class MyEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string", length=5, name="cd_key")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $code;
     ...  

以下是SHOW CREATE TABLE my_entity;

的结果
CREATE TABLE `my_entity` (
  `cd_key` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `number` int(11) NOT NULL,
  PRIMARY KEY (`cd_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

此处查询原则尝试使用doctrine:schema:update命令执行:

ALTER TABLE my_entity CHANGE cd_key cd_key VARCHAR(5) NOT NULL;
  • 我在每次执行命令之间清理Symfony缓存。
  • 我尝试在@Column注释上添加nullable=false(事件,如果已经定义为@Id),但没有效果。
  • a doctrine:schema:validate找不到任何映射问题(当然除了同步)
  • 我尝试删除并重新创建完整的数据库,但没有效果。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

此问题已于2017年报告至少hereherehere,并且应由此PR修复。

更新doctrine/dbal将是解决方案(not working for me though):

$ composer require doctrine/dbal:^2.7.1

从配置中取消设置服务器版本(mysql / mariadb)也可以解决问题(但仍然不适合我)。

如果一个人正在使用迁移,他仍然可以手动调整它们(但他的模式将始终未被删除)。

答案 1 :(得分:-1)

我遇到了类似的问题。对我来说,使用SQL删除表,然后再次运行DOCTRINE:SCHEMA:UPDATE --FORCE为我工作。

似乎做一些SQL请求手动混淆了Doctrine。

这样说,我假设您已将@ORM\Table(name="my_entity")@ORM\Entity(repositoryClass="myrepository")放在您的班级定义上;)。

希望它有所帮助。