I understand the problem. You can chance the DB type (and you did) but 
web2py still tries to put an 'F' or a 'T' in there.

I modified trunk so that this can be achieved:

import copy
db =DAL()
db._adapter.types = copy.copy(db._adapter.types)
db._adapter.types['boolean']='TINYINT(1)'
db._adapter.TRUE = 1
db._adapter.FALSE = 0
db.define_table('test',Field('b', 'boolean'))
db.test.insert(b=True)
db.test.insert(b=False)
rows = db(db.test).select()
print db.executesql(db(db.test)._select())

this should work fine.

On Monday, 1 October 2012 14:34:43 UTC-5, MichaelF wrote:
>
> 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
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>

-- 



Reply via email to