I spoke too soon about this fixing the problem. It seems that adding/updating a record with such a field using the admin interface, and using a smartgrid, doesn't do it.
I create this table: db.define_table('Test_bool', Field('test_bool', 'boolean')) I also have the following at the start of my db.py model file: db._adapter.types = copy.copy(db._adapter.types) db._adapter.types['boolean']='TINYINT(1)' Once web2py creates the table I confirm that MySQL has ccreated the field as TINYINT(1). I go into the admin interface and insert a record, checking the test_bool checkbox. The INSERTed record has a 0 for that field. I try it again, same result. I then UPDATE one of those records, checking the test_bool checkbox, and the field remains at 0. I then create a simple smartgrid: def test_bool(): grid = SQLFORM.smartgrid( db.Test_bool, deletable = True, editable = True, create = True ) return locals() I edit one of the records, checking the box, yet it doesn't 'take'. Now, if I go in manually ans set the field to 1 (using MySQL Workbench, outside the web2py environment), then go to the grid, I see that the box is checked. If I uncheck it, that 'takes'. ?? Thanks. On Saturday, September 22, 2012 7:21:07 AM UTC-6, MichaelF wrote: > > Converting to 2.x fixed the problems. > > On Wednesday, September 19, 2012 12:04:28 PM UTC-6, MichaelF wrote: >> >> I have come across one bug with this. If I add a record using the admin >> interface, I check the 'Is_home_team' checkbox (Is_home_team is defined as >> a boolean, of course), yet the record has 0 for that field. Given that, as >> you might expect then, all records have a 0 for that field. >> >> ?? >> >> On Monday, September 17, 2012 9:53:34 PM UTC-6, MichaelF wrote: >>> >>> Well, that's unfortunate. I've migrated this semi-manually; I had only >>> four 'boolean' fields. >>> >>> Other than that, the suggested fix ( >>> db._adapter.types['boolean']='TINYINT(1)' ) seems to work. >>> >>> On Monday, September 17, 2012 8:42:24 PM UTC-6, Massimo Di Pierro wrote: >>>> >>>> I cannot reproduce this error with your code in 2.0.9 and the lines in >>>> your traceback do not correspond to the source code I have. I think you >>>> may >>>> be using an older dal.py >>>> >>>> On Monday, 17 September 2012 16:43:30 UTC-5, MichaelF wrote: >>>>> >>>>> Yes; here it is: >>>>> >>>>> 1. >>>>> 2. >>>>> 3. >>>>> 4. >>>>> 5. >>>>> 6. >>>>> 7. >>>>> 8. >>>>> 9. >>>>> >>>>> Traceback (most recent call last): >>>>> File "gluon/restricted.py", line 205, in restricted >>>>> File "C:/Program Files >>>>> (x86)/web2py/applications/NCAA_schedule/models/db.py" >>>>> <http://127.0.0.1:8000/admin/default/edit/NCAA_schedule/models/db.py>, >>>>> line 165, in <module> >>>>> File "gluon/dal.py", line 6320, in define_table >>>>> File "gluon/dal.py", line 742, in create_table >>>>> File "gluon/dal.py", line 797, in migrate_table >>>>> File "gluon/dal.py", line 6714, in __getitem__ >>>>> KeyError: 'length_is_yards' >>>>> >>>>> The table definition follows: >>>>> >>>>> db.define_table('Pool', >>>>> Field('Pool_name', 'string', required=True, >>>>> unique=True), >>>>> Field('Address1', 'string', length=60), >>>>> Field('Address2', 'string', length=60), >>>>> Field('City', 'string', length=60), >>>>> Field('State', 'string', length=2), >>>>> Field('Zip', 'string', length=15), >>>>> Field('Nr_lanes', 'integer', required=True), >>>>> Field('Length', 'integer', required=True), >>>>> Field('Length_is_yards', 'boolean', >>>>> required=True,default=True), >>>>> Field('Has_moveable_bulkhead', 'boolean', >>>>> required=True, >>>>> default=False), >>>>> format='%(Pool_name)s %(Nr_lanes)s') >>>>> >>>>> Line 165 is the last line of the statement (format=...). >>>>> >>>>> On Monday, September 17, 2012 3:15:08 PM UTC-6, Massimo Di Pierro >>>>> wrote: >>>>>> >>>>>> Do you have a traceback with more information? >>>>>> >>>>>> On Monday, 17 September 2012 14:23:56 UTC-5, MichaelF wrote: >>>>>>> >>>>>>> Thanks. However, I refer to that field with upper case in all >>>>>>> places. Can you tell me where the lower case 'pending' comes from? The >>>>>>> field name has always been defined as upper case, and the app has been >>>>>>> working up until I made that latest change. So I went into the db and >>>>>>> changed the field name to start with lower case, then changed the model >>>>>>> file to make it lower-case 'pending'. That worked, but now the next >>>>>>> boolean >>>>>>> field in the db.py file has an upper-case/lower-case problem. The field >>>>>>> is >>>>>>> "Length_is_yards" in both the db.py file and the db, and has been that >>>>>>> way >>>>>>> for weeks, and we've been through several db migrations for the past >>>>>>> several weeks (not sure about on those particular tables, though). Now >>>>>>> I >>>>>>> get the KeyError as shown above, but this time it's for field >>>>>>> 'length_is_yards'. It looks to me that web2py is assuming it's lower >>>>>>> case. >>>>>>> >>>>>>> One of my migrations last week was the "fake_migrate_all=True" type; >>>>>>> don't know if that's relevant. >>>>>>> >>>>>>> Also, in the .database file the field name is Length_is_yards >>>>>>> (leading "L" is capital), as is the field name in the MySQL db. >>>>>>> >>>>>>> I'm confused. >>>>>>> >>>>>>> Michael >>>>>>> >>>>>>> On Monday, September 17, 2012 12:51:34 PM UTC-6, Massimo Di Pierro >>>>>>> wrote: >>>>>>>> >>>>>>>> Field('Pending' <<< upper case >>>>>>>> ... >>>>>>>> <type 'exceptions.KeyError'> 'pending' <<< lower case >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Monday, 17 September 2012 11:37:13 UTC-5, MichaelF wrote: >>>>>>>>> >>>>>>>>> I did a simple import of 'copy' and that got me by that first >>>>>>>>> problem. But now I have the following problem: >>>>>>>>> >>>>>>>>> db.define_table('Person_certification', >>>>>>>>> Field('Person', db.Person), >>>>>>>>> ... >>>>>>>>> Field('Pending', 'boolean', default = False), >>>>>>>>> ... >>>>>>>>> >>>>>>>>> I get the following error on the line that defines field 'Pending' >>>>>>>>> (and this is the first 'boolean' type in the file): >>>>>>>>> <type 'exceptions.KeyError'> 'pending'I have not changed the >>>>>>>>> underlying MySQL db yet; all the booleans are still char(1). Do I >>>>>>>>> need to >>>>>>>>> change them first to Tinyint(1)? I tried that; same error. >>>>>>>>> >>>>>>>>> Thanks. >>>>>>>>> >>>>>>>>> On Monday, September 17, 2012 9:21:37 AM UTC-6, MichaelF wrote: >>>>>>>>>> >>>>>>>>>> 1. What will I need to import to get it to recognize 'copy'? I >>>>>>>>>> run the suggested code and get told that 'copy' does not exist. (I'm >>>>>>>>>> running 2.5; what do I conditionally import?) >>>>>>>>>> >>>>>>>>>> 2. Are we doing a copy because all the adapters share the same >>>>>>>>>> 'types' object? >>>>>>>>>> >>>>>>>>>> On Tuesday, August 7, 2012 3:48:35 PM UTC-6, Massimo Di Pierro >>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> On can always do: >>>>>>>>>>> >>>>>>>>>>> db=DAL('mssql://...') >>>>>>>>>>> db._adapter.types = copy.copy(db._adapter.types) >>>>>>>>>>> db._adapter.types['boolean']='TINYINT(1)' >>>>>>>>>>> >>>>>>>>>>> It should work. Can you please check it? >>>>>>>>>>> >>>>>>>>>>> On Tuesday, 7 August 2012 11:56:59 UTC-5, Osman Masood wrote: >>>>>>>>>>>> >>>>>>>>>>>> However, web2py maintains the promise of backwards >>>>>>>>>>>> compatibility. One way is to have a 'tinyint_boolean' datatype for >>>>>>>>>>>> those >>>>>>>>>>>> who want to use tinyints as booleans. But that looks kind of messy >>>>>>>>>>>> and >>>>>>>>>>>> inelegant. >>>>>>>>>>>> >>>>>>>>>>>> An alternative is this: We could add a migration script to >>>>>>>>>>>> /scripts to convert all boolean data types from CHAR(1) to >>>>>>>>>>>> TINYINT(1), and >>>>>>>>>>>> from 'T' to 1 and 'F' to 0. Also, when a table model is called in >>>>>>>>>>>> define_table(), it would check whether its boolean data types are >>>>>>>>>>>> CHAR or >>>>>>>>>>>> INT, and save the result somewhere (so it wouldn't have to keep >>>>>>>>>>>> checking.) >>>>>>>>>>>> If the server is restarted, it would once again perform this >>>>>>>>>>>> check. So, a >>>>>>>>>>>> user would run the migration script and simply restart the server. >>>>>>>>>>>> >>>>>>>>>>>> On Thursday, July 12, 2012 9:18:33 PM UTC+8, simon wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> I have just come across this exact same issue. >>>>>>>>>>>>> >>>>>>>>>>>>> The web2py adapter converts boolean to char(1) but in MySQL >>>>>>>>>>>>> the specification is that boolean is stored as tinyint with 0 and >>>>>>>>>>>>> 1. So >>>>>>>>>>>>> web2py adapter is incorrect. Not changing it perpetuates the >>>>>>>>>>>>> mistake. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On Sunday, 6 March 2011 05:14:49 UTC, Kevin Ivarsen wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'm connecting to a legacy MySQL database (migrate=False) >>>>>>>>>>>>>> with a lot >>>>>>>>>>>>>> of fields declared BOOLEAN, and noticed that attempts to >>>>>>>>>>>>>> modify these >>>>>>>>>>>>>> fields with the DAL failed. The DAL issues a query like this: >>>>>>>>>>>>>> >>>>>>>>>>>>>> UPDATE sometable SET someflag='T' WHERE ... >>>>>>>>>>>>>> >>>>>>>>>>>>>> but this gets rejected by MySQL. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Reading through dal.py, I see that the "boolean" type maps to >>>>>>>>>>>>>> CHAR(1) >>>>>>>>>>>>>> in MySQLAdapter, and represent() converts to "T" and "F" >>>>>>>>>>>>>> values. >>>>>>>>>>>>>> However, the BOOLEAN type is a synonym for TINYINT(1) in >>>>>>>>>>>>>> MySQL, with >>>>>>>>>>>>>> values 0 or 1, according to: >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> I can trivially change this behavior in dal.py for my >>>>>>>>>>>>>> purposes, but it >>>>>>>>>>>>>> would be interested to try to incorporate this into the main >>>>>>>>>>>>>> web2py >>>>>>>>>>>>>> distribution. Unfortunately, the trivial change will break >>>>>>>>>>>>>> backwards >>>>>>>>>>>>>> compatibility for people who are already depending on the >>>>>>>>>>>>>> current >>>>>>>>>>>>>> behavior. Any thoughts on how this could be done in a >>>>>>>>>>>>>> backwards- >>>>>>>>>>>>>> compatible way, or is it too much of an edge case to worry >>>>>>>>>>>>>> about? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Cheers, >>>>>>>>>>>>>> Kevin >>>>>>>>>>>>> >>>>>>>>>>>>> --