我在 Symfony 6.2 中构建了一个应用程序,并让它在 Raspberry Pi 上运行。以下是先决条件:
本地:
服务器(Pi):
最近我对一个实体做了一个小改动,并添加了一个新成员。所以我遵循了我的标准程序。
创建迁移
$ 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
这导致了这个元数据错误
所以我尝试了以下方法:
新模式在本地有效并且按预期工作。 在服务器上,架构无效,但它也按预期工作。因此实体的新成员受到尊重,但不知何故映射不正确。
当我擦除所有迁移并将其转储到服务器上的一个迁移时,发生了一件奇怪的事情。它突然使用 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)';
提前感谢您提供任何线索。我仍然是初学者,此时欢迎每一个提示:)如果我的描述中缺少任何重要的内容,请告诉我。谢谢!!
这个问题也有描述 https://github.com/doctrine/migrations/issues/1406
到目前为止我发现的最好的解决方案是忽略
bin/console doctrine:schema:validate -v
DROP TABLE doctrine_migration_versions;
php bin/console make:migration
忽略此差异,因此除验证之外的其他所有内容都可以正常工作。