dbal icon indicating copy to clipboard operation
dbal copied to clipboard

MySql enum field throws error during migration

Open G0URAB opened this issue 6 months ago • 7 comments

Bug Report

Q A
Version 4.3

Summary

  • Existing MySql enum field throws error during migration after upgrading from 4.2.4 to 4.3.

Current behavior

Column column name has invalid type

Expected behavior

  • MySql enum fields are supported
  • No error is thrown during migration

How to reproduce

  • Create an enum field in MySql with an equivalent entity property e.g. status
    #[Column(type: "string", columnDefinition: "ENUM('visible', 'invisible')")]
    private $status;
  • Execute migration e.g. php bin/console doctrine:migrations:migrate

G0URAB avatar Jul 14 '25 09:07 G0URAB

What error do you have?

Can you post it with a stacktrace?

andrew-demb avatar Jul 14 '25 09:07 andrew-demb

Column {column-name} has invalid type

Stacktrace:

./bin/console doctrine:migrations:migrate -vv --no-interaction
PHP Fatal error:  Declaration of EnumVisibilityType::convertToDatabaseValue($value, Doctrine\DBAL\Platforms\AbstractPlatform $platform) must be compatible with Doctrine\DBAL\Types\Type::convertToDatabaseValue(mixed $value, Doctrine\DBAL\Platforms\AbstractPlatform $platform): mixed in /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/src/Bundle/ExternalProductsBundle/Entity/EnumVisibilityType.php on line 20
PHP Stack trace:
PHP   1. {main}() /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/bin/console:0
PHP   2. Symfony\Component\Console\Application->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 0; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = []; protected $interactive = FALSE; private array $tokens = [0 => 'doctrine:migrations:migrate', 1 => '-vv', 2 => '--no-interaction']; private array $parsed = *uninitialized* }, $output = *uninitialized*) /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/bin/console:100
PHP   3. Symfony\Bundle\FrameworkBundle\Console\Application->doRun($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 0; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = []; protected $interactive = FALSE; private array $tokens = [0 => 'doctrine:migrations:migrate', 1 => '-vv', 2 => '--no-interaction']; private array $parsed = *uninitialized* }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 128; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 128; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /home/bmratuszny/code/customizing-svv/vendor/symfony/console/Application.php:175
PHP   4. EosUptrade\TICKeos\Bundle\SymfonyOneBundle\Console\SymfonyOneAwareApplication->registerCommands() /home/bmratuszny/code/customizing-svv/vendor/symfony/framework-bundle/Console/Application.php:72
PHP   5. EosUptrade\TICKeos\Core\Kernel->boot() /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/src/Bundle/SymfonyOneBundle/Console/SymfonyOneAwareApplication.php:65
PHP   6. Symfony\Component\HttpKernel\Kernel->boot() /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/src/Core/Kernel.php:150
PHP   7. Symfony\Component\HttpKernel\Kernel->preBoot() /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/Kernel.php:126
PHP   8. Symfony\Component\HttpKernel\Kernel->initializeContainer() /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/Kernel.php:772
PHP   9. Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp($cacheDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', $buildDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', $io = *uninitialized*) /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/Kernel.php:554
PHP  10. Symfony\Bundle\FrameworkBundle\CacheWarmer\AbstractPhpFileCacheWarmer->warmUp($cacheDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev') /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php:108
PHP  11. Doctrine\Bundle\DoctrineBundle\CacheWarmer\DoctrineMetadataCacheWarmer->doWarmUp($cacheDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', $arrayAdapter = class Symfony\Component\Cache\Adapter\ArrayAdapter { private bool $storeSerialized = TRUE; private array $values = []; private array $tags = []; private array $expiries = []; private int $defaultLifetime = 0; private float $maxLifetime = 0; private int $maxItems = 0; protected ?Psr\Log\LoggerInterface $logger = NULL }, $buildDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev') /home/bmratuszny/code/customizing-svv/vendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php:47
PHP  12. Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata() /home/bmratuszny/code/customizing-svv/vendor/doctrine/doctrine-bundle/src/CacheWarmer/DoctrineMetadataCacheWarmer.php:43
PHP  13. Doctrine\Bundle\DoctrineBundle\Mapping\MappingDriver->getAllClassNames() /home/bmratuszny/code/customizing-svv/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php:87
PHP  14. Doctrine\Persistence\Mapping\Driver\MappingDriverChain->getAllClassNames() /home/bmratuszny/code/customizing-svv/vendor/doctrine/doctrine-bundle/src/Mapping/MappingDriver.php:23
PHP  15. Doctrine\ORM\Mapping\Driver\AttributeDriver->getAllClassNames() /home/bmratuszny/code/customizing-svv/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php:87

G0URAB avatar Jul 14 '25 09:07 G0URAB

It looks like your EnumVisibilityType class is not compatible with the base Type class from DBAL 4 (see what was done in #5043).

xabbuh avatar Jul 14 '25 09:07 xabbuh

It's surprising that you did not get an error with 4.2 already.

greg0ire avatar Jul 14 '25 10:07 greg0ire

Closing as this is a problem on your side.

derrabus avatar Jul 14 '25 10:07 derrabus

Sorry for the confusion, I was actually posting on behalf of a colleague (on vacation) who sent me the wrong stacktrace.

Actually, he tried to fix the enum issue by creating an EnumType as in this example. It failed and sent the stacktrace instead of the original one 😅

I tried to reproduce the original error. Here is the stacktrace :-)

 [Doctrine\DBAL\Exception\InvalidColumnDeclaration]  
  Column "application" has invalid type    
Exception trace:
  at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Exception/InvalidColumnDeclaration.php:16
 Doctrine\DBAL\Exception\InvalidColumnDeclaration::fromInvalidColumnType() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php:204
 Doctrine\DBAL\Platforms\AbstractPlatform->getStringTypeDeclarationSQL() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Types/StringType.php:19
 Doctrine\DBAL\Types\StringType->getSQLDeclaration() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php:1486
 Doctrine\DBAL\Platforms\AbstractPlatform->getColumnDeclarationSQL() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php:2379
 Doctrine\DBAL\Platforms\AbstractPlatform->columnsEqual() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Schema/Comparator.php:444
 Doctrine\DBAL\Schema\Comparator->columnsEqual() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Schema/Comparator.php:196
 Doctrine\DBAL\Schema\Comparator->compareTables() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/MySQL/Comparator.php:40
 Doctrine\DBAL\Platforms\MySQL\Comparator->compareTables() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Schema/Comparator.php:62
 Doctrine\DBAL\Schema\Comparator->compareSchemas() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Provider/DBALSchemaDiffProvider.php:44
 Doctrine\Migrations\Provider\DBALSchemaDiffProvider->getSqlDiffToMigrate() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Provider/LazySchemaDiffProvider.php:50
 Doctrine\Migrations\Provider\LazySchemaDiffProvider->getSqlDiffToMigrate() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Version/DbalExecutor.php:144
 Doctrine\Migrations\Version\DbalExecutor->executeMigration() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Version/DbalExecutor.php:72
 Doctrine\Migrations\Version\DbalExecutor->execute() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/DbalMigrator.php:87
 Doctrine\Migrations\DbalMigrator->executePlan() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/DbalMigrator.php:54
 Doctrine\Migrations\DbalMigrator->executeMigrations() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/DbalMigrator.php:134
 Doctrine\Migrations\DbalMigrator->migrate() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Tools/Console/Command/MigrateCommand.php:225
 Doctrine\Migrations\Tools\Console\Command\MigrateCommand->execute() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Command/Command.php:326
 Symfony\Component\Console\Command\Command->run() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Application.php:1096
 Symfony\Component\Console\Application->doRunCommand() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/framework-bundle/Console/Application.php:126
 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Application.php:324
 Symfony\Component\Console\Application->doRun() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/framework-bundle/Console/Application.php:80
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Application.php:175
 Symfony\Component\Console\Application->run() at /builds/iGct5bTxq/21/php/TICK/core/bin/console:99

G0URAB avatar Jul 14 '25 11:07 G0URAB

@derrabus Could you please reopen the issue? I posted the correct stacktrace.

G0URAB avatar Jul 14 '25 15:07 G0URAB