教义模式更新总是尝试添加 NOT NULL
Posted
技术标签:
【中文标题】教义模式更新总是尝试添加 NOT NULL【英文标题】:Doctrine schema update always try to add NOT NULL 【发布时间】:2017-07-21 02:04:14 【问题描述】:我有一个全新的 Symfony 2.8 安装,带有教义和 mysql 5.6 堆栈。
执行doctrine:schema:update --force
后,我可以看到Database schema updated successfully! "x" queries were executed
这是我的问题:即使我多次执行,学说总是会发现架构差异。
使用--dump-sql
,我可以看到所有这些查询都与:
但是,当我检查我的数据库时,这些列已经有一个 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,则为事件),但没有效果。
doctrine:schema:validate
没有发现任何映射问题(当然同步除外)
我尝试删除并重新创建完整的数据库,但没有效果。
有什么想法吗?
【问题讨论】:
不会设置nullable=false
意味着它将NOT NULL
添加为该列的一部分?将其更改为 nullable=true
将允许该值为 null。
【参考方案1】:
这个问题至少在 2017 年被报告过 here、here 和 here 并且应该由这个 PR 修复。
更新 doctrine/dbal
将是解决方案 (not working for me though):
$ composer require doctrine/dbal:^2.7.1
从配置中取消设置服务器版本(mysql/mariadb)也可以解决问题(但仍然不适合我)。
如果有人使用迁移,他仍然可以手动调整它们(但他的架构将始终不同步)。
【讨论】:
【参考方案2】:我遇到过类似的问题。对我来说,使用 SQL 删除表然后再次运行 DOCTRINE:SCHEMA:UPDATE --FORCE
为我工作。
似乎手动执行一些 SQL 请求会使 Doctrine 感到困惑。
这么说,我假设您已将 @ORM\Table(name="my_entity")
和 @ORM\Entity(repositoryClass="myrepository")
放在您的类定义上;)。
希望它有所帮助。
【讨论】:
我尝试删除表(甚至是完整的数据库),但是在新的 'doctrine:schema:update' 之后,我遇到了同样的问题。无论如何感谢您的帮助:)以上是关于教义模式更新总是尝试添加 NOT NULL的主要内容,如果未能解决你的问题,请参考以下文章