Symfony Make:Migration : 元数据存储不是最新的,请运行 sync-metadata-storage 命令修复此问题
Posted
技术标签:
【中文标题】Symfony Make:Migration : 元数据存储不是最新的,请运行 sync-metadata-storage 命令修复此问题【英文标题】:Symfony Make:Migration : The metadata storage is not up to date, please run the sync-metadata-storage command to fix this issue 【发布时间】:2020-10-06 06:53:19 【问题描述】:每次我尝试使用命令行迁移时都会遇到这个问题:php bin/console make:migration
甚至doctrine:migration status
当我尝试doctrine:migration:sync-metadata-storage
他们告诉我时,我仍然收到相同的错误消息。
我目前正在学习 symfony,并且一直在遵循指南,但不知何故我遇到了这个问题 Symfony 4.4 php 7.2
【问题讨论】:
【参考方案1】:尝试将 .env 中的 DATABASE_URL 从
DATABASE_URL=mysql://root:@127.0.0.1:3306/testtest?serverVersion=10.4.11
到
DATABASE_URL=mysql://root:@127.0.0.1:3306/testtest?serverVersion=mariadb-10.4.11
Symfony 文档建议指定版本号而不是数据库类型
“您可以在 config/packages/doctrine.yaml 中配置更多选项,包括您的 server_version(例如,如果您使用的是 MySQL 5.7,则为 5.7),这可能会影响 Doctrine 的功能。” https://symfony.com/doc/current/doctrine.html
原答案:https://github.com/doctrine/DoctrineMigrationsBundle/issues/337#issuecomment-645390496
对于 MariaDB,您需要完整的 semver 兼容版本:Major.Minor.Patch。通过执行mysql --version
,您将获得当前正在运行的正确版本。
【讨论】:
那你使用什么服务器类型? 我用mysql 如果您使用 XAMPP,您可以转到:localhost/phpmyadmin/index.php 以检查您的服务器版本和类型。 在我的情况下,我使用的是 docker,所以我必须在docker-compose.yml
中的 environment
下做同样的事情
只需在您的 mariaDB 服务器上执行“SELECT VERSION()”并将此字符串用作配置中的版本。在我的情况下 ?serverVersion=10.3.25-MariaDB-0+deb10u1 并且它有效。【参考方案2】:
对我来说,在服务器版本前加上 mariadb-x.x.x 就足够了。它解决了这个问题。
“如果您正在运行 MariaDB 数据库,则应在 serverVersion 前加上 mariadb-(例如:mariadb-10.2.12)。”
https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
【讨论】:
这可以立即解决问题,而无需重写配置。 更多细节:参见github.com/doctrine/DoctrineMigrationsBundle/issues/… 和github.com/doctrine/DoctrineMigrationsBundle/pull/398 将文档添加到包本身【参考方案3】:如果我在.env
中更改DATABASE_URL
就可以了
发件人:
DATABASE_URL=mysql://root:@127.0.0.1:3306/testtest?serverVersion=10.4.11
收件人:
DATABASE_URL=mysql://root:@127.0.0.1:3306/testtest?serverVersion=mariadb-10.4.11
【讨论】:
【参考方案4】:就我而言,当我从 url 中删除 : ?serverVersion=5.2 时,它会起作用。
【讨论】:
魅力十足!【参考方案5】:升级到 Doctrine 迁移 3 后我遇到了同样的问题
似乎很多东西都发生了变化,包括存储迁移版本的表名:(
所以我更新了config/packages/doctrine_migrations.yaml
,创建了一个新的(空白)迁移,清除了缓存(以防万一),一切都很好:)
doctrine_migrations:
migrations_paths:
# namespace is arbitrary but should be different from App\Migrations
# as migrations classes should NOT be autoloaded
'DoctrineMigrations': '%kernel.project_dir%/src/Migrations'
storage:
# Default (SQL table) metadata storage configuration
table_storage:
table_name: 'migration_versions'
version_column_name: 'version'
version_column_length: 1024
executed_at_column_name: 'executed_at'
execution_time_column_name: 'execution_time'
顺便说一句。文档是最新的;)https://symfony.com/doc/master/bundles/DoctrineMigrationsBundle/index.html
【讨论】:
这对我有用!谢谢。 “有趣”的部分:我实际上有一个从头开始的新项目并得到了这个错误,所以没有更新。我从一开始就使用 Symfony 和 Doctrine。 ? 等一下!我把所有东西都拿回来了...... :(在我将存储配置添加到教义_migrations.yaml 后,命令make:migration
再次工作,但doctrine:migrations:migrate
让我回到错误:“元数据存储不是最新的,请运行sync-metadata-storage 命令来解决这个问题。”。如果我运行 doctrine:migrations:sync-metadata-storage
会遇到同样的错误 ...
如果使用 MySQL 你需要设置 version_column_length: 255
我们应该放什么来代替'migration_versions'、'version'、1024...@Bukashk0zzz 说如果使用mysql,你必须使用version_column_length: 255,但是你在哪里看到的?跨度>
因为它试图创建一个索引。而Mysql中的全搜索索引长度只能是255【参考方案6】:
您必须将 .env 中的 serverVersion=5.7
更改为 serverVersion=mariadb-10.4.8
【讨论】:
【参考方案7】:Symfony 5.1
如果你得到:
指定的平台版本“maridb-10.4.13”无效。平台版本必须以以下格式指定:“
只做一个
config/doctrine.yaml
doctrine:
dbal:
server_version: 'mariadb-10.4.13'
或在配置文件中 .env
DATABASE_URL=mysql://...yoursettings...?serverVersion=mariadb-10.4.13
【讨论】:
我不能对这个答案给予足够的支持。真的不知道您必须指定 server_version: 'mariadb-...'。【参考方案8】:删除 .env 文件中的服务器版本
DATABASE_URL=mysql://root:@127.0.0.1:3306/DB_Name
【讨论】:
【参考方案9】:我已经在数据库 URL 字符串中添加了serverVersion=mariadb-10.4.11
,它起作用了。
【讨论】:
【参考方案10】:我也有同样的问题是因为新版本的学说迁移3.0
php bin/console debug:config DoctrineMigrationsBundle
https://symfony.com/doc/master/bundles/DoctrineMigrationsBundle/index.html
【讨论】:
这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review【参考方案11】:我通过修改文件临时解决了这个问题:/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Comparator.php
改变方法 diffColumn:
// This is a very nasty hack to make comparator work with the legacy json_array type, which should be killed in v3
if ($this->isALegacyJsonComparison($properties1['type'], $properties2['type']))
array_shift($changedProperties);
$changedProperties[] = 'comment';
//////////////////////////////////////////////////////////////////
// This is my change for fix problem//////////////////////////////
//////////////////////////////////////////////////////////////////
if ($properties1['default'] === 'NULL')
$properties1['default'] = null;
if ($properties2['default'] === 'NULL')
$properties2['default'] = null;
/////////////////////////////////////////////////////////////////
// Null values need to be checked additionally as they tell whether to create or drop a default value.
// null != 0, null != false, null != '' etc. This affects platform's table alteration SQL generation.
if (($properties1['default'] === null) !== ($properties2['default'] === null)
|| $properties1['default'] != $properties2['default'])
$changedProperties[] = 'default';
【讨论】:
【参考方案12】:https://symfony.com/doc/master/bundles/DoctrineMigrationsBundle/index.html
按照说明进行操作
作曲家需要学说/学说迁移包
php bin/控制台原则:迁移:生成
php bin/console 原则:迁移:状态 --show-versions
php bin/控制台原则:迁移:迁移
一切都对我有用
【讨论】:
【参考方案13】:如果您将教义/doctrine-migrations-bundle 升级到版本 3,此解决方案对我有用:
只需运行:php bin/console dictionary:migrations:sync-metadata-storage
【讨论】:
【参考方案14】:同样的问题.. 我“喜欢”它,但不要在家里尝试!
我删除了这些行
vendor\doctrine\migrations\lib\Doctrine\Migrations\Metadata\Storage\TableMetadataStorage.php
从第 191 行开始
$expectedTable = $this->getExpectedTable();
if ($this->needsUpdate($expectedTable) !== null)
throw MetadataStorageError::notUpToDate();
然后运行make:migration
和migrations:migrate
。
迁移成功后将函数粘贴回去。
【讨论】:
将服务器版本前缀为“mariadb-10.5.11”对我不起作用,事实上,除了这个之外,任何建议的解决方案都对我有用。评论这一行可以避免错误,但编辑供应商文件对我来说似乎不是一个好的解决方案。今天还有其他可行的解决方案吗? 不确定我应该在 GitHub 上寻找什么。于是直接来***询问。 github.com/doctrine/DoctrineMigrationsBundle/issues/337【参考方案15】:在您的 .env 文件中,您可以使用默认设置模式:
DATABASE_URL=mysql://db-username:db-password@127.0.0.1/db-name
但是需要在doctrine.yaml中配置server_version
示例配置如下所示:
doctrine:
dbal:
driver: 'pdo_mysql'
server_version: 'mariadb-10.5.8-focal'
charset: UTF8
url: '%env(resolve:DATABASE_URL)%'
就我而言,它是 mariadb-10.5.8-focal。
【讨论】:
【参考方案16】:对我来说,当我在 .env 文件中删除“?serverVersion=5.7”时,它对我有用
来自:DATABASE_URL="mysql://root:@127.0.0.1:3306/centre?serverVersion=5.7"
到 DATABASE_URL="mysql://root:@127.0.0.1:3306/centre"
【讨论】:
这似乎与 jally-ph 的答案重复【参考方案17】:只需执行此命令
symfony 控制台缓存:清除
它为我解决了问题
【讨论】:
以上是关于Symfony Make:Migration : 元数据存储不是最新的,请运行 sync-metadata-storage 命令修复此问题的主要内容,如果未能解决你的问题,请参考以下文章