> so, for SQL databases, if a column is removed or dropped, it's not
> migrated for sqlite. Is there a reason for this?

sqlite does not support drop columns.


On Aug 27, 2:03 pm, Álvaro J. Iradier <[email protected]>
wrote:
> Hi everyone, this is a long one
>
> today I noticed one of my xxxx_settings.table file was written
> everytime. The table definition was changed a long ago, from the old
> chema:
>
> CREATE TABLE settings(
>     id INTEGER PRIMARY KEY AUTOINCREMENT,
>     key CHAR(512),
>     value CHAR(512)
> );
>
> to the new:
>
> CREATE TABLE settings(
>     id INTEGER PRIMARY KEY AUTOINCREMENT,
>     key CHAR(512) NOT NULL UNIQUE,
>     value CHAR(512)
> );
>
> the change is, key column was made NOT NULL UNIQUE.
>
> So first question I noticed. In the migrate procedure, I noticed the
> following code:
>         for key in keys:
>             if not key in sql_fields_old:
>                 query = ['ALTER TABLE %s ADD %s %s;' % \
>                          (self._tablename, key,
> sql_fields_aux[key].replace(', ', new_add))]
>             elif self._db._dbname == 'sqlite':
>                 query = None
> ...
>
> so, for SQL databases, if a column is removed or dropped, it's not
> migrated for sqlite. Is there a reason for this?
>
> Then I tried commenting the "if self._db._dbname == 'sqlite':" line,
> and I got the following SQL error:
>
> OperationalError: Cannot add a UNIQUE column
>
> which makes sense, it's not trivial to add a UNIQUE column to an
> existing database...
>
> But what makes me worry is, at the end of the _migrate method, I find this:
>
>             if query:
>                 ...
>                 if key in sql_fields:
>                     sql_fields_old[key] = sql_fields[key]
>                 else:
>                     del sql_fields_old[key]
>         tfile = open(self._dbt, 'w')
>         portalocker.lock(tfile, portalocker.LOCK_EX)
>         print "Here2:", self._dbt, sql_fields, sql_fields_old
>         cPickle.dump(sql_fields_old, tfile)
>         portalocker.unlock(tfile)
>         tfile.close()
>
> First, sql_fields_old is updated with the migrated value ONLY if query
> is not None. For sqlite it's None for changed columns. So, later,
> cPickle dumps the value of sql_fields_old, so the file
> xxxx_settings.table is written with the same old values, as this field
> was not migrated.
>
> So, for every request, web2py detects a migration is needed, but it
> does nothing but writing the .table file with the old values.
>
> I think the correct behaviour should be throwing an error if migration
> can't be done.
>
> Can you suggest a fix for this?
>
> Thanks very much.
>
> --
> Álvaro J. Iradier Muro
> Departamento de Desarrollo
> [email protected]

Reply via email to