Doctrine orm 条令/MySQL媒体文本+;不必要的ALTER表
在mysql 5.7+2.7/DBAL 2.9上运行,具有:Doctrine orm 条令/MySQL媒体文本+;不必要的ALTER表,doctrine-orm,doctrine,dbal,Doctrine Orm,Doctrine,Dbal,在mysql 5.7+2.7/DBAL 2.9上运行,具有: /** * @ORM\Entity() */ class Entity { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=100000, nullabl
/**
* @ORM\Entity()
*/
class Entity {
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=100000, nullable=true)
*/
private $bigText;
}
orm:schema工具:创建创建表实体:
CREATE TABLE `Entity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bigText` mediumtext COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
但是,模式工具会考虑需要更新的表,运行orm:schema-tool:update--dump-sql
ALTER TABLE Entity CHANGE bigText bigText MEDIUMTEXT DEFAULT NULL;
执行更新工作正常,但没有帮助:它仍然认为表需要更新
我已经跟踪到了Doctrine\DBAL\Schema\Comparator的diffColumn方法,其中比较了当前和待列定义的平台选项。“未来”列没有平台选项(这是有意义的,因为我认为它还没有在平台上),而当前列确实有它们,即字符集和排序规则,在我的测试用例中,默认值是:['charset'=>'utf8','collation'=>'utf8\u unicode\u ci']
,通过原则\DBAL\Schema\MySqlSchemaManager->\u getPortableTableColumnDefinition()
在列对象上设置
翻一翻源代码,我发现我可以使用EventListeners:因为Doctrine\DBAL\Schema\AbstractSchemaManager->\u getPortableTableColumnList()
将发出一个onSchemaColumnDefinition
事件,如果我设置$event->preventDefault()
在那里创建我自己的Column对象并使用$event->setColumn($Column)
,我可以绕过MySqlSchemaManager->\u getPortableTableColumnDefinition()
。或者,我可以去摆弄另一面,更改从类/注释创建的模式,并使用postGenerateSchemaTable
(这比处理onSchemaColumnDefinition
)简单得多,感觉也不那么奇怪)。
虽然我对内部流有了更多的了解,但在MySQL中处理mediumtext时,如果不始终创建不必要的ALTER表,这感觉太复杂了
当然,我可以通过使用type=“text”而不是type=“string”+一个固定长度来完全回避这个问题(在提出这个问题之前,我在浏览这里的问题时意识到了这一点),但出于好奇:我是否缺少处理MySQL中属于中等文本长度的固定长度字段的一些基本方法