Custom data types (data domain) not working (mysql)
Tried to create custom data types as per documentation, but they aren't working.
phinx.yml:
paths:
migrations: '%%PHINX_CONFIG_DIR%%/db/migrations'
seeds: '%%PHINX_CONFIG_DIR%%/db/seeds'
environments:
default_migration_table: phinxlog
default_environment: development
production:
adapter: mysql
host: localhost
name: production_db
user: root
pass: ''
port: 3306
charset: utf8
development:
adapter: mysql
host: localhost
name: phinx_test
user: phinx_test
pass: 'phinx_test'
port: 3306
charset: utf8
testing:
adapter: mysql
host: localhost
name: testing_db
user: root
pass: ''
port: 3306
charset: utf8
version_order: creation
data_domain:
test_type:
type: string
length: 666
Test migration script:
<?php
use Phinx\Migration\AbstractMigration;
class TestMigration extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* https://book.cakephp.org/phinx/0/en/migrations.html
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* addCustomColumn
* renameColumn
* addIndex
* addForeignKey
*
* Any other destructive changes will result in an error when trying to
* rollback the migration.
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$this->table('test')
->addColumn('test_column', 'test_type')
->create();
}
}
When trying migration, got error:
$ ./vendor/bin/phinx migrate
Phinx by CakePHP - https://phinx.org.
using config file ./phinx.yml
using config parser yml
using migration paths
- /home/user/test/phinx/db/migrations
using seed paths
warning no environment specified, defaulting to: development
using adapter mysql
using database phinx_test
ordering by creation time
== 20200617223037 TestMigration: migrating
InvalidArgumentException: An invalid column type "test_type" was specified for column "test_column". in /home/user/test/phinx/vendor/robmorgan/phinx/src/Phinx/Db/Table.php:305
Stack trace:
#0 /home/user/test/phinx/db/migrations/20200617223037_test_migration.php(35): Phinx\Db\Table->addColumn()
#1 /home/user/test/phinx/vendor/robmorgan/phinx/src/Phinx/Migration/Manager/Environment.php(109): TestMigration->change()
#2 /home/user/test/phinx/vendor/robmorgan/phinx/src/Phinx/Migration/Manager.php(377): Phinx\Migration\Manager\Environment->executeMigration()
#3 /home/user/test/phinx/vendor/robmorgan/phinx/src/Phinx/Migration/Manager.php(350): Phinx\Migration\Manager->executeMigration()
#4 /home/user/test/phinx/vendor/robmorgan/phinx/src/Phinx/Console/Command/Migrate.php(123): Phinx\Migration\Manager->migrate()
#5 /home/user/test/phinx/vendor/symfony/console/Command/Command.php(258): Phinx\Console\Command\Migrate->execute()
#6 /home/user/test/phinx/vendor/symfony/console/Application.php(911): Symfony\Component\Console\Command\Command->run()
#7 /home/user/test/phinx/vendor/symfony/console/Application.php(264): Symfony\Component\Console\Application->doRunCommand()
#8 /home/user/test/phinx/vendor/robmorgan/phinx/src/Phinx/Console/PhinxApplication.php(69): Symfony\Component\Console\Application->doRun()
#9 /home/user/test/phinx/vendor/symfony/console/Application.php(140): Phinx\Console\PhinxApplication->doRun()
#10 /home/user/test/phinx/vendor/robmorgan/phinx/bin/phinx(28): Symfony\Component\Console\Application->run()
#11 {main}
Using phinx 0.12.1.
I concur, this occurs on Postgres as well. Do you know an ETA to the fix?
` data_domain: varchar: type: string
varchar_req:
type: string
'null': 'false'
unique_id:
type: integer
identity: true
seed: 1031
increment: 13
` When trying migration, got error:
Phinx by CakePHP - https://phinx.org.
using config file ./phinx.yml
using config parser yml
using migration paths
- /var/www/db/migrations
using seed paths
- /var/www/db/seeds
using environment development
using adapter pgsql
using database visionplanpro
ordering by creation time
== 20200818150859 AAA: migrating
BEGIN;
InvalidArgumentException: An invalid column type "unique_id" was specified for column "user_id". in /var/www/vendor/robmorgan/phinx/src/Phinx/Db/Table.php:305
Stack trace:
#0 /var/www/db/migrations/20200818150859_a_a_a.php(22): Phinx\Db\Table->addColumn('user_id', 'unique_id')
#1 /var/www/vendor/robmorgan/phinx/src/Phinx/Migration/Manager/Environment.php(109): AAA->change()
#```
Phinx 0.12.3
In 0.12.5 still broken
why doesn't it work? I followed the documentation and wrote a whole list of variables, then discovered this error. Anyway, it's a great way to keep the types used in plain sight. Thanks
Hello, seems this still not working on 0.12.11
However I checked Table::AddColumn()
https://github.com/cakephp/phinx/blob/2046c447b1a4425956555118200138e22ebd680c/src/Phinx/Db/Table.php#L300-L304
And it uses AddColumn::build() to build the columns where type $columnName is not an instance of Column however this doesn't do anything with data domains at all
But AdapterInterface does define a method that can create columns from data domains
https://github.com/cakephp/phinx/blob/9a6ce1e7fdf0fa4e602ba5875b5bc9442ccaa115/src/Phinx/Db/Adapter/AdapterInterface.php#L161
I briefly changed the Table::addColumn to use the adapter instead
if ($columnName instanceof Column) {
$action = new AddColumn($this->table, $columnName);
} else {
$action = new AddColumn($this->table, $this->getAdapter()->getColumnForType($columnName, $type, $options));
}
and it seems to work, I must mention that I didn't fork the project or run tests. Is there a reason this still doesn't work, was there a regression and is now not available to use?
My main goal was to have extra precision on the timestamp for MySQL since Table::addTimestamp doesn't provide a way to add a length/limit to the timestamp type
/// ...SomeMigration.php
$table->addColumn($table->getAdapter()->getColumnForType('created_at', 'created_ts', []));
$table->addColumn($table->getAdapter()->getColumnForType('updated_at', 'created_ts', []));
$table->addColumn($table->getAdapter()->getColumnForType('deleted_at', 'deleted_ts', []));
// phinx.php
'data_domain' => [
'created_ts' => [
'type' => 'timestamp',
'timezone' => true,
'length' => 3,
'default' => 'CURRENT_TIMESTAMP(3)'
],
'updated_ts' => [
'type' => 'timestamp',
'timezone' => true,
'length' => 3,
'default' => 'CURRENT_TIMESTAMP(3)',
'update' => 'CURRENT_TIMESTAMP(3)',
'null' => true
],
'deleted_ts' => [
'type' => 'timestamp',
'timezone' => true,
'length' => 3,
'null' => true
]
]
Any update to this issue? Its still not solved..
Check if #2156 solves the problem for you.
Hey, thanks just tested it out through composer, and it worked using the example I provided above. although the migration ran fine, the created_ts definition does not specify the null option it got created as null it is not mentioned on the docs but I assumed it would pick up the defaults options, manually specifying 'null' => false, worked
The default for the null option has been changed for 0.13, it is now true by default. I'm not sure if an explicit default should win over the internal null option default.
You might want to add your input over in #2154, where a possible reversal is currently discussed.
#2154
Just tested, works perfectly! Awesome! When will this be merged & released?
(For now I'll just keep your PR as patch, and patch it myself 😊 )
Depends on when someone has time to review it. Unfortunately the bulk of this work is currently burdened on pretty much only one person, so it can take a little while.