编辑:事实证明,同一台计算机上的其他项目也遇到了同样的问题。问题是针对一个特定的项目:
我有一个Symfony4项目,其中我有几个实体(通过make:entity
创建(。我刚刚注意到最后 4 次迁移中具有完全相同的查询(是的,我在两者之间运行迁移(。例:
$this->addSql('ALTER TABLE event CHANGE visible_from visible_from DATETIME DEFAULT NULL, CHANGE visible_till visible_till DATETIME DEFAULT NULL, CHANGE max_signups max_signups INT DEFAULT NULL');
我手动运行了该查询,这实际上更新了表。然后,我创建了一个新的迁移来测试:上面的查询再次出现。
我已经清除了缓存,运行了doctrine:cache:clear-metadata
,仔细检查了奇怪的东西,但一切都很正常。
我每次都有相同的 3 个查询,它们都有一个共同点:它们具有 nullable=true。所有其他实体中没有 nullable=true。
/**
* @ORMColumn(type="integer", nullable=true)
*/
private $maxSignups;
向下迁移可能是一个提示:
ALTER TABLE event CHANGE visible_from visible_from DATETIME DEFAULT 'NULL',
This I find odd---^
MariaDB 版本:10.2.14
PHP: 7.2.4
symfony/orm-pack: "^1.0">
有谁知道为什么?
我仍然不知道为什么(所以我会暂时搁置这个问题(,但这就是我所做的:
我同时运行MySQL和MariaDB,它默认为MySQL。关闭它,切换到MariaDB并在doctrine.yaml中添加一个版本:
doctrine:
dbal:
# configure these for your database server
driver: 'pdo_mysql'
server_version: 'mariadb-10.2.14'
不过,它并不真正关心版本。我写了一个错字并写了12.2.14
它绝对没问题。我猜它在某处有一个version>$n
检查。
一切都在这里解释:https://github.com/symfony/symfony-docs/pull/9547#issue-179389686
最重要的是设置前缀"mariadb"的server_version,MariaDB版本不太重要。
或者,您可能根本不设置server_version,然后应该自动检测它。
下面是负责解析server_version的 DBAL 驱动程序函数:
public function createDatabasePlatformForVersion($version)
{
$mariadb = false !== stripos($version, 'mariadb');
if ($mariadb && version_compare($this->getMariaDbMysqlVersionNumber($version), '10.2.7', '>=')) {
return new MariaDb1027Platform();
}
if ( ! $mariadb && version_compare($this->getOracleMysqlVersionNumber($version), '5.7.9', '>=')) {
return new MySQL57Platform();
}
return $this->getDatabasePlatform();
}
这是整个班级的链接:https://github.com/doctrine/dbal/blob/f76bf5ef631cec551a86c2291fc749534febebf1/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php#L133