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:migrationmigrations: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)%'

就我而言,它是 ma​​riadb-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 命令修复此问题的主要内容,如果未能解决你的问题,请参考以下文章

在我的控制器中运行工匠命令(make:migration)

使用 make migration 命令添加列错误

laravel migration

laravel框架的数据迁移 (摘取)

laravel框架之数据迁移和数据填充

好久没玩laravel了,5.6玩下