Migrations: Come Eliminare Una Colonna Con Sqlite3

Sapete come si possa fare una migration che elimini una colonna con sqlite3? Purtroppo la normale migration non funziona e si verifica un’eccesione. A quanto pare l’AR non supporta la cancellazione di una colonna in sqlite3. Magari voi avete una soluzione:




<?php


class m121023_163621_RemoveColumnRole extends CDbMigration

{


    public function up()

    {

        $this->dropColumn('notifyii', 'role');

    }


    public function down()

    {

        echo "m121023_163621_AddTitleToMigration does not support migration down.\n";

        return false;

    }


}



Ho aperto ora una una issue su github.

Hai dimenticato il link per l’issue - https://github.com/y...yii/issues/1601

Come ho scritto li e come viene spiegato al link che ti ho postatto li (http://www.sqlite.org/faq.html#q11), sqlite ha un limitato supporto per l’alter table cosi che drop column non esiste in esso.

Per fare rimuovere una collona devi fare tutto manualmente.

Esempio copiato dal link:




BEGIN TRANSACTION;

CREATE TEMPORARY TABLE t1_backup(a,<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' />;

INSERT INTO t1_backup SELECT a,b FROM t1;

DROP TABLE t1;

CREATE TABLE t1(a,<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' />;

INSERT INTO t1 SELECT a,b FROM t1_backup;

DROP TABLE t1_backup;

COMMIT;



Io ti ringrazio Maurizio ma mi chiedo: c’è una ragione per la quale l’ORM di Yii non supporta questa cosa? L’ORM dovrebbe rendermi tutto trasparente. In questo caso però non è possibile e mi costringe a scrivere SQL nativo. Per me rimane un bug.

Non capisco perche pensi questo sia un bug… e perche Yii dovrebe solverlo… e una "feature" che non e supportata in sqlite…

se sarebbe un bug allora e sqlite che lo dovrebe solvere non Yii…

In Yii si guarda sempre di includere soltanto funzioni che sono communi per tutti i database supportati, pero se una feature come "drop column" e tanto utile e non viene supportata da soltanto un database allora viene inclusa perche sarebbe uno sprecco non includerla per via di sqlite.

Penso che sia un big perché le migrazioni mi permettono di fare qualche cosa, salvo poi dirmi che non è vero. A questo punto, mi piacerebbe avere le migrazioni per SQLite3.

Nella documentazione specifica di sqlite ce scritto che dropColumn() non e suportato - http://www.yiiframework.com/doc/api/1.1/CSqliteSchema#dropColumn-detail

Adesso si lavora ad agiungere addPrimaryKey() e dropprimaryKey() alla migration… e dinuovo sqlite non ha il supporto per questi SQL commandi

https://github.com/y...omment-10005188