Thanks for checking it out. In the mean time, I'm working around the
problem by overriding maxcharlength right after setting db, like this:

    db = DAL(...)
    db._adapter.maxcharlength = 65535

Now I just need to restore a bunch of truncated data :-(

On Jan 22, 1:06 pm, Massimo Di Pierro <massimo.dipie...@gmail.com>
wrote:
> I agree that is the problem:
>
> Field("description", "string", length=2048),
>
> according to:http://dev.mysql.com/doc/refman/5.0/en/char.html
> "Values in VARCHAR columns are variable-length strings. The length can
> be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to
> 65,535 in 5.0.3 and later versions".
>
> We set varchar max to 255 to avoid problems with older versions of
> mysql. Since problems were reported by users.
> There should not have been a migration in your case. I will look in
> this more.
>
> On Jan 22, 2:43 pm, "Jonathan Z." <jzem...@gmail.com> wrote:
>
>
>
> > It's probably also important to note that the "before" table existed
> > since 1.85.x.  I keep the "migrate=False" flag set on it, until I make
> > a change.  As I noted previously, the change happened on 1.91.6.  So
> > the issue is data loss affected by changes in the web2py DAL.
>
> > I've been digging around, and my guess is that this line (3694) in
> > dal.Table is the problem:
>
> >     field.length = min(field.length,self._db and
> > self._db._adapter.maxcharlength or INFINITY)
>
> > Since maxcharlength for MySQLAdapter is 255, this has the affect of
> > silently truncating my specified field lengths.
>
> > On Jan 22, 11:48 am, "Jonathan Z." <jzem...@gmail.com> wrote:
>
> > > Massimo,
>
> > > Here is an example of one of the tables that got a truncated field:
>
> > > before...
>
> > > db.define_table("thing",
> > >     Field("user_id", db.auth_user, notnull=True, readable=False,
> > > writable=False),
> > >     Field("title", "string", length=128, notnull=True, unique=True,
> > > required=True),
> > >     Field("slug", "string", length=128, notnull=True, unique=True,
> > > required=True),
> > >     Field("state", "string", length=10, notnull=True, required=True,
> > > default="created", requires=IS_IN_SET(("created", "started",
> > > "completed"))),
> > >     Field("description", "string", length=2048),
> > >     Field("created", "datetime", notnull=True, readable=False,
> > > writable=False, default=request.now),
> > >     Field("updated", "datetime", readable=False, writable=False,
> > > update=request.now),
> > >     Field("uuid", "string", length=16, notnull=True, unique=True,
> > > readable=False, writable=False),
> > >     format="%(title)s"
> > > )
>
> > > after...
>
> > > db.define_table("thing",
> > >     Field("user_id", db.auth_user, notnull=True, readable=False,
> > > writable=False),
> > >     Field("title", "string", length=128, notnull=True, unique=True,
> > > required=True),
> > >     Field("slug", "string", length=128, notnull=True, unique=True,
> > > required=True),
> > >     Field("state", "string", length=10, notnull=True, required=True,
> > > default="created", requires=IS_IN_SET(("created", "started",
> > > "completed"))),
> > >     Field("description", "string", length=2048),
> > >     Field("things", "list:string"), # NEW FIELD
> > >     Field("created", "datetime", notnull=True, readable=False,
> > > writable=False, default=request.now),
> > >     Field("updated", "datetime", readable=False, writable=False,
> > > update=request.now),
> > >     Field("uuid", "string", length=16, notnull=True, unique=True,
> > > readable=False, writable=False),
> > >     format="%(title)s"
> > > )
>
> > > After this change (addition of a new field) and subsequent DB
> > > migration, the "description" field was truncated from 2048 characters
> > > to 255.  Note that this change didn't alter the field length on
> > > sqlite.  But it did truncate the description field on mysql.
>
> > > On Jan 22, 10:55 am, Massimo Di Pierro <massimo.dipie...@gmail.com>
> > > wrote:
>
> > > > Can you tell us what the model was before and after migration?
>
> > > > Massimo
>
> > > > On Jan 22, 10:02 am, "Jonathan Z." <jzem...@gmail.com> wrote:
>
> > > > > I have a number of fields specifying a length > 255 (some as large as
> > > > > 2K).  On a recent schema migrate, web2py truncated all of these fields
> > > > > to 255, resulting in substantial data loss.
>
> > > > > My database is mysql.  I'm on version 1.91.6 of web2py.  I'm pretty
> > > > > sure this has something to do with the new DAL.

Reply via email to