Not sure if your patch also handles the case when there's no boolean, but 
I'm also getting the exception with this in session.dirty:

IdentitySet([UserLoginTracking(id=37, userid='bills', 
lastseen=datetime.datetime(2015, 4, 29, 12, 57, 52, 648042, 
tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)), 
login_complete=<sqlalchemy.sql.functions.now at 0x6cd5f90; now>, 
tutorial_seen=None, prior_lastseen=None)])

This also throws the exception, just by slightly modifying your test on a 
boolean to use timestamp instead:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class A(Base):
    __tablename__ = 'a'
    id = Column(Integer, primary_key=True)
    data = Column(DateTime(timezone=True))


e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)

s = Session(e)
s.add(A(data=None))
s.commit()

a1 = s.query(A).first()
a1.data = func.now()
s.commit()


On Wednesday, April 29, 2015 at 9:48:36 AM UTC-7, Michael Bayer wrote:
>
>  
>
> On 4/29/15 11:00 AM, Bill Schindler wrote:
>  
> Here's the contents of session.dirty just prior to the commit. It looks 
> like what I expected, with no unexpected additional objects. Is there 
> anything in there that looks like it could cause the exception? 
>
>  session.dirty = IdentitySet([
>     LiveSession(id=49, prodid=u'folio', userid=u'josh_saesan', 
> sessionid=u'7c8a0b87-0c13-455f-8d0f-9cd90f4eff38', courseid=None, 
> endpoint=u'tcp://192.168.5.32:21992', 
> isconnected=<sqlalchemy.sql.elements.False_ object at 0x6aed050>, 
> connected=datetime.datetime(2015, 
> 4, 28, 16, 18, 9, 391405, 
> tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)), 
> disconnected=<sqlalchemy.sql.functions.now at 0x6aed1d0; now>),
>     LiveSession(id=45, prodid=u'pmp1', userid=u'josh_saesan', 
> sessionid=u'57047c05-26b1-4f46-b017-0be242c3fd11', courseid=20789, 
> endpoint=u'tcp://192.168.5.32:21992', 
> isconnected=<sqlalchemy.sql.elements.False_ object at 0x6a95d50>, 
> connected=datetime.datetime(2015, 4, 28, 14, 45, 18, 974124, 
> tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)), 
> disconnected=<sqlalchemy.sql.functions.now at 0x6a95dd0; now>),
>     LiveSession(id=48, prodid=u'pmp1', userid=u'josh_saesan', 
> sessionid=u'd5ced200-58b4-41c1-9142-876ac1b83f70', courseid=20789, 
> endpoint=u'tcp://192.168.5.32:21992', 
> isconnected=<sqlalchemy.sql.elements.False_ object at 0x6a95ed0>, 
> connected=datetime.datetime(2015, 4, 28, 15, 1, 47, 528904, 
> tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)), 
> disconnected=<sqlalchemy.sql.functions.now at 0x6aed090; now>),
>     LiveSession(id=47, prodid=u'pmp1', userid=u'steve_drees', 
> sessionid=u'be63ba27-4c50-47b4-bdae-6ccd0c7ec3df', courseid=None, 
> endpoint=u'tcp://192.168.5.32:21992', 
> isconnected=<sqlalchemy.sql.elements.False_ object at 0x6a95d90>, 
> connected=datetime.datetime(2015, 4, 28, 14, 46, 4, 879577, 
> tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)), 
> disconnected=<sqlalchemy.sql.functions.now at 0x6a95f10; now>),
>     LiveSession(id=46, prodid=u'folio', userid=u'bills', 
> sessionid=u'15947462-0c01-4aa3-8ea2-3f05e095a80a', courseid=None, 
> endpoint=u'tcp://192.168.5.32:21992', 
> isconnected=<sqlalchemy.sql.elements.False_ object at 0x6aed190>, 
> connected=datetime.datetime(2015, 4, 28, 16, 18, 47, 999584, 
> tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)), 
> disconnected=<sqlalchemy.sql.functions.now at 0x6aed310; now>)])
>  
>
> yup, its the boolean + the SQL false expression
>
> from sqlalchemy import *
> from sqlalchemy.orm import *
> from sqlalchemy.ext.declarative import declarative_base
>
> Base = declarative_base()
>
> class A(Base):
>     __tablename__ = 'a'
>     id = Column(Integer, primary_key=True)
>     data = Column(Boolean)
>
> e = create_engine("sqlite://", echo=True)
> Base.metadata.create_all(e)
>
> s = Session(e)
> s.add(A(data=None))
> s.commit()
>
> a1 = s.query(A).first()
> a1.data = false()
> s.commit()
>
>
>
> i will commit the patch in the next few hours.
>
>
>
>
>
>   
>  
> On Wednesday, April 29, 2015 at 6:39:12 AM UTC-7, Michael Bayer wrote: 
>>
>>  
>>
>> On 4/29/15 9:25 AM, Bill Schindler wrote:
>>  
>> This error is being thrown on code that worked with 0.9.8. It seems to be 
>> checking a comparison on something, but I can't figure out which "this 
>> clause" the exception is referring to. Here's the stripped-down code 
>> leading up to the commit: 
>>
>>       ancient = utcnow() - timedelta(hours=8)
>>     ancient_conn = (
>>         (LiveSession.isconnected) &
>>         (LiveSession.connected < ancient))
>>     for conn in session.query(LiveSession).filter(ancient_conn):
>>         conn.isconnected = False
>>         conn.disconnected = func.now()
>>     session.commit()
>>  
>>  I've tried it without the loop and it fails about 75% of the time with 
>> the same traceback. I'm also getting this exception on another ORM object 
>> that has a string column and four timestamp columns (and isn't updated in a 
>> loop). Test updating that object also gives me the same exception about 75% 
>> of the time on flush.
>>
>>  Neither ORM object has any relationships or anything other than 
>> straight column definitions.
>>
>>            File 
>> "/opt/certwise-lcs/eggs/lcs.web.events-1.0.0-py2.7.egg/lcs/web/events/utility.py",
>>  
>> line 296, in _dead
>>             session.commit()
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/session.py",
>>  
>> line 790, in commit
>>             self.transaction.commit()
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/session.py",
>>  
>> line 392, in commit
>>             self._prepare_impl()
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/session.py",
>>  
>> line 372, in _prepare_impl
>>             self.session.flush()
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/session.py",
>>  
>> line 2004, in flush
>>             self._flush(objects)
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/session.py",
>>  
>> line 2122, in _flush
>>             transaction.rollback(_capture_exception=True)
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/util/langhelpers.py",
>>  
>> line 60, in __exit__
>>             compat.reraise(exc_type, exc_value, exc_tb)
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/session.py",
>>  
>> line 2086, in _flush
>>             flush_context.execute()
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/unitofwork.py",
>>  
>> line 373, in execute
>>             rec.execute(self)
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/unitofwork.py",
>>  
>> line 532, in execute
>>             uow
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py",
>>  
>> line 170, in save_obj
>>             mapper, table, update)
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py",
>>  
>> line 613, in _emit_update_statements
>>             lambda rec: (
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/orm/persistence.py",
>>  
>> line 456, in _collect_update_commands
>>             value, state.committed_state[propkey]):
>>           File 
>> "/opt/certwise-lcs/eggs/SQLAlchemy-1.0.2-py2.7-linux-x86_64.egg/sqlalchemy/sql/elements.py",
>>  
>> line 2726, in __bool__
>>             raise TypeError("Boolean value of this clause is not defined")
>>         exceptions.TypeError: Boolean value of this clause is not defined
>>   
>>
>> this error is not related to the code illustrated above; it has to do 
>> with an object that is present in session.dirty which has some kind of SQL 
>> expression clause inside of its state, but also seems related to using an 
>> odd kind of comparison function within a custom type, likely a PickleType 
>> that is using a custom "comparator" function.
>>
>> I can create this stack trace exactly.  But I have to do something really 
>> weird to make it happen.   It doesn't provide the failure in 0.9.9 so is a 
>> regression.  But super curious if you have something in your mapping that 
>> looks like this:
>>
>> from sqlalchemy import *
>> from sqlalchemy.orm import *
>> from sqlalchemy.ext.declarative import declarative_base
>>
>> Base = declarative_base()
>>
>> def comparator(a, b):
>>     return a > b
>>
>> class A(Base):
>>     __tablename__ = 'a'
>>     id = Column(Integer, primary_key=True)
>>     data = Column(PickleType(comparator=comparator))
>>
>>
>> e = create_engine("sqlite://", echo=True)
>> Base.metadata.create_all(e)
>>
>> s = Session(e)
>> s.add(A(data='some data'))
>> s.commit()
>>
>> a1 = s.query(A).first()
>> a1.data = func.foo("im a SQL expression")
>> s.commit()
>>
>>
>> are you using PickleType, with a custom comparator that doesn't come down 
>> to using "==", and are using a SQL expression as the value to be persisted?
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>  
>>  --
>> Bill
>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "sqlalchemy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/sqlalchemy.
>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>>   -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] <javascript:>.
> To post to this group, send email to [email protected] 
> <javascript:>.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>
>
>  

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to