Symfony 6 / Doctrine / 迁移:[错误] 数据库模式与当前映射文件不同步

问题描述 投票:0回答:1

我在 Symfony 6.2 中构建了一个应用程序,并让它在 Raspberry Pi 上运行。以下是先决条件:

本地:

  • 操作系统:Ubuntu 20.04.6 LTS
  • 数据库:版本 15.1 分发 10.10.5-MariaDB
  • PHP:8.2.7

服务器(Pi):

  • 操作系统:Debian GNU/Linux 11(牛眼)
  • 数据库:版本 15.1 分发 10.5.19-MariaDB
  • PHP:8.2.7

最近我对一个实体做了一个小改动,并添加了一个新成员。所以我遵循了我的标准程序。

创建迁移

$ php bin/console doctrine:migrations:diff

迁移代码

final class Version20230618154133 extends AbstractMigration
{
    public function getDescription(): string
    {
        return '';
    }

    public function up(Schema $schema): void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->addSql('ALTER TABLE submission ADD status_has_not_reacted TINYINT(1) NOT NULL');
    }

    public function down(Schema $schema): void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->addSql('ALTER TABLE submission DROP status_has_not_reacted');
    }
}

推送更改并运行 Jenkins 构建存档后,我在暂存中提取该存档,导入生产数据库并运行命令

php bin/console doctrine:migrations:migrate

运行成功。

然后我就跑了

php bin/console doctrine:schema:validate

检查一切是否正常。但这一次它抛出了这个错误 同步错误

奇怪的是,我平时做的事情基本上没有改变,效果很好。数据库中唯一发生变化的是服务器上的 MariaDB 版本从 10.5.18 > 10.5.19,但由于这是一个次要版本,我认为这不会造成麻烦。

config/packages/doctrine.yaml

framework:
    cache:
        pools:
            doctrine.result_cache_pool:
                adapter: cache.app
            doctrine.system_cache_pool:
                adapter: cache.system

doctrine:
    dbal:
        dbname: '%env(DB_NAME)%'
        host: '%env(DB_HOST)%'
        user: '%env(DB_USER)%'
        password: '%env(DB_PASSWORD)%'
        server_version: 'mariadb-10.10.5'
        charset: utf8mb4
        logging: '%kernel.debug%'
        options:
            platform: mariadb
        types:
            datetime_immutable: \Carbon\Doctrine\DateTimeImmutableType
            datetime: \Carbon\Doctrine\DateTimeType
    orm:
        auto_generate_proxy_classes: true
        enable_lazy_ghost_objects: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true

        dql:
            datetime_functions:
                YEAR: DoctrineExtensions\Query\Mysql\Year


when@prod: &doctrine_prod
    doctrine:
        dbal:
            server_version: mariadb-10.5.19

when@staging: *doctrine_prod

迁移进行得很顺利,所以我尝试了命令来仔细检查:

php bin/console doctrine:migrations:list

这导致了这个元数据错误

所以我尝试了以下方法:

  • 在 config/packages/doctrine.yaml 中,我将 server_version 参数更改为较新的版本
  • 我使用了“doctrine:migrations:sync-metadata-storage”,运行成功
    • 如果数据库中发生更改,我会比较“doctrine_migration_versions”表,但事实并非如此
  • 我尝试在 .yaml 文件中使用带有“mariadb-10.5.19”的字符串连接字符串
  • 我检查了服务器上的上次 apt-upgrade 是否有任何关键更新,但这只是从 PHP 8.2.5 > 8.2.7 的切换
  • 我检查了 MariaDB 和 PHP 版本的变更日志,在我看来不包含关键更改

新模式在本地有效并且按预期工作。 在服务器上,架构无效,但它也按预期工作。因此实体的新成员受到尊重,但不知何故映射不正确。

当我擦除所有迁移并将其转储到服务器上的一个迁移时,发生了一件奇怪的事情。它突然使用 MySQL 平台而不是 MariaDB 平台,这很奇怪,因为我在配置中定义了平台并且我也在运行 MariaDB。 DBAL 平台

当我用

更新架构时
php bin/console doctrine:schema:update --complete --dump-sql

它显示了这一点,我不知道该怎么办...(即使当我执行此操作时,错误仍然存在)。

DROP TABLE doctrine_migration_versions;
ALTER TABLE vendor CHANGE updated_at updated_at DATETIME(6) DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', CHANGE last_name last_name VARCHAR(255) DEFAULT NULL, CHANGE alternative_emails alternative_emails LONGTEXT DEFAULT NULL COMMENT '(DC2Type:simple_array)', CHANGE paypal paypal VARCHAR(255) DEFAULT NULL, CHANGE brand brand VARCHAR(255) DEFAULT NULL, CHANGE website website VARCHAR(255) DEFAULT NULL, CHANGE main_category main_category VARCHAR(255) DEFAULT NULL;
ALTER TABLE market CHANGE updated_at updated_at DATETIME(6) DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', CHANGE info_facebook_event info_facebook_event VARCHAR(255) DEFAULT NULL, CHANGE banned_submissions banned_submissions LONGTEXT DEFAULT NULL COMMENT '(DC2Type:simple_array)';
ALTER TABLE submission CHANGE main_category main_category VARCHAR(255) DEFAULT NULL, CHANGE updated_at updated_at DATETIME(6) DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', CHANGE color_code color_code VARCHAR(255) DEFAULT NULL, CHANGE vendor_last_name vendor_last_name VARCHAR(255) DEFAULT NULL, CHANGE vendor_paypal vendor_paypal VARCHAR(255) DEFAULT NULL, CHANGE vendor_brand vendor_brand VARCHAR(255) DEFAULT NULL, CHANGE vendor_website vendor_website VARCHAR(255) DEFAULT NULL, CHANGE assignment_designation assignment_designation VARCHAR(255) DEFAULT NULL, CHANGE assignment_table_id assignment_table_id VARCHAR(255) DEFAULT NULL, CHANGE assignment_table_position assignment_table_position VARCHAR(255) DEFAULT NULL, CHANGE status_screening status_screening VARCHAR(255) DEFAULT 'unseen' NOT NULL;
ALTER TABLE comment CHANGE author author VARCHAR(255) DEFAULT NULL;
ALTER TABLE mail CHANGE created_at created_at DATETIME(6) DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)';

提前感谢您提供任何线索。我仍然是初学者,此时欢迎每一个提示:)如果我的描述中缺少任何重要的内容,请告诉我。谢谢!!

symfony mariadb doctrine migration dbal
1个回答
0
投票

这个问题也有描述 https://github.com/doctrine/migrations/issues/1406

到目前为止我发现的最好的解决方案是忽略

bin/console doctrine:schema:validate -v

如果它发现的唯一差异是
DROP TABLE doctrine_migration_versions;

php bin/console make:migration
忽略此差异,因此除验证之外的其他所有内容都可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.