Migrazione

Salve,

sto provando a configurare le procedure di migrazione. Purtroppo si verifica un errore di sintassi se per definire i campi utilizzo la sintassi di mysql.

Mentre se uso i tipi astratti forniti dalla piattaforma non ci sono problemi.




Apply the above migration? (yes|no) [no]:yes

*** applying m130424_103112_create_test_table

    > create table test_table ...exception 'CDbException' with message 'CDbCommand failed to execute the SQL statement: CDbCommand failed to prepare the SQL statement: SQLSTATE[HY000]: General error: 1 near "UNSIGNED": syntax error. The SQL statement executed was: CREATE TABLE 'test_table' (

        "id" tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci' in /srv/services/im/yii/framework/db/CDbCommand.php:354

Stack trace:

#0 /srv/services/im/yii/framework/db/CDbCommand.php(1251): CDbCommand->execute()

#1 /srv/services/im/yii/framework/db/CDbMigration.php(229): CDbCommand->createTable('test_table', Array, 'ENGINE=InnoDB  ...')

#2 /srv/services/im/admin/protected/migrations/m130424_103112_create_test_table.php(10): CDbMigration->createTable('test_table', Array, 'ENGINE=InnoDB  ...')

#3 /srv/services/im/yii/framework/cli/commands/MigrateCommand.php(386): m130424_103112_create_test_table->up()

#4 /srv/services/im/yii/framework/cli/commands/MigrateCommand.php(110): MigrateCommand->migrateUp('m130424_103112_...')

#5 [internal function]: MigrateCommand->actionUp(Array)

#6 /srv/services/im/yii/framework/console/CConsoleCommand.php(173): ReflectionMethod->invokeArgs(Object(MigrateCommand), Array)

#7 /srv/services/im/yii/framework/console/CConsoleCommandRunner.php(68): CConsoleCommand->run(Array)

#8 /srv/services/im/yii/framework/console/CConsoleApplication.php(92): CConsoleCommandRunner->run(Array)

#9 /srv/services/im/yii/framework/base/CApplication.php(162): CConsoleApplication->processRequest()

#10 /srv/services/im/yii/framework/yiic.php(34): CApplication->run()

#11 /srv/services/im/admin/protected/yiic.php(7): require_once('/srv/services/i...')

#12 /srv/services/im/admin/protected/yiic(4): require_once('/srv/services/i...')



Qualcuno ha qualche idea?

Grazie.

La dicitura corretta dovrebbe essere questa:




CREATE TABLE test_table (

        id tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci



impostando il campo che si autoincrementa anche come chiave primaria.

Grazie per la risposta, mi rendo conto adesso che la mia spiegazione era incompleta.

Il fatto è che questo query dovrebbe essere generata dal framework e passata a mySQL.

Non capisco cosa vada storto. Il codice della migrazione è il seguente:




class m130424_103112_create_test_table extends CDbMigration

{

        public function up()

        {

        $this->createTable('test_table', array(

                'id' => 'tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT',


            ),'ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci');

        }

....

}



Da come ho letto sulla documentazione, il fatto di definire un campo con delle parole non previste dai tipi colonna astratti (integer, string, pk, text…) dovrebbe semplicemente copiare la definizione senza alterarla.

Cosa che sembra fare, ma non capisco l’errore, il codice è copiato da una query testata e funzionante.

Grazie.

Prova a verificare il SQL generato dal sistema.

Ho verificato e succede questo:

Il codice generato dal sistema (che viene stampato a video nel messaggio d’errore) è questo




CREATE TABLE 'test_table' (

        "id" tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,

        PRIMARY KEY (contact_id)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'



e lanciando la query nel client MySQL da lo stesso errore di prima, allora ho provato a togliere gli apici, cioè:




CREATE TABLE test_table (

        id tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,

        PRIMARY KEY (id)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci



In questo modo va tutto a buon fine soltanto ora non si capisce la storia degli apici…

In questo codice però




CREATE TABLE 'test_table' (

        "id" tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,

        PRIMARY KEY (contact_id)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'



la chiave primaria non coincide con nessun campo della tabella.

si vero, ma sostituendo con "id" il problema rimane.

Sostituisco "tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT" con pk e passa la paura.




class m130424_103112_create_test_table extends CDbMigration

{

    public function up()

    {

        $this->createTable('tbl_news', array(

            'id' => 'pk',

            'title' => 'string NOT NULL',

            'content' => 'text',

        ));

    }

}



Ricordati che non stai scrivendo dell’SQL.

Ok, però se avessi la necessità di generare una tabella con un campo esattamente come quello che voglio io non sarebbe possibile con questo sistema?

Sto lavorando su un db che non è stato progettato da me e ha diversi campi definiti in quel modo che sono chiavi esterne, non vorrei doverlo ristrutturare tutto.

In questa discussione e nella documentazione di CDbSchema.php c’è un chiaro riferimento al fatto che se non è possibile definire un campo con i tipi astratti si può tranquillamente usare la sintassi del database utilizzato che verrà lasciata intatta. E’ possibile che la causa degli errori sia solo quel banale problema di quoting. Credo che la causa sia intrinseca nella piattaforma come per quest’altro problema.

Grazie a tutti.

Fai una cosa: esegui una normalissima create table eseguendo del normalissimo sql.