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 <http://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
<http://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
<http://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 <http://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 <http://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>)])
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
<http://groups.google.com/group/sqlalchemy>.
For more options, visit https://groups.google.com/d/optout
<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
<http://groups.google.com/group/sqlalchemy>.
For more options, visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.