I haven't boiled this down to a short test case yet, but when my WHERE clause gets especially long I start getting the "recursion depth exceeded" exception. Is this a well-known limitation of sqlalchemy? We're running this query in production currently without SQLAlchemy, and it performs fine, but perhaps I need to look for another approach...
If I keep the filter condition relatively short, my query looks like this and runs fine (with fake columns start_date, X, Y, and Z on table T):
However, if I make the filter() clause very long (over 150 AND NOT... clauses), I start getting exceptions with this stack trace:
File "test.py", line 350, in do_test
print q
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 3031, in __str__
return str(self._compile_context().statement)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/expression.py", line 1790, in __str__
return unicode(self.compile()).encode('ascii', 'backslashreplace')
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/expression.py", line 1778, in compile
return self._compiler(dialect, bind=bind, **kw)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/expression.py", line 1784, in _compiler
return dialect.statement_compiler(dialect, self, **kw)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 277, in __init__
engine.Compiled.__init__(self, dialect, statement, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 705, in __init__
self.string = self.process(self.statement)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 724, in process
return obj._compiler_dispatch(self, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 72, in _compiler_dispatch
return getter(visitor)(self, **kw)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 941, in visit_select
t = select._whereclause._compiler_dispatch(self, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 72, in _compiler_dispatch
return getter(visitor)(self, **kw)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in visit_clauselist
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 475, in <genexpr>
s for s in
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in <genexpr>
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 72, in _compiler_dispatch
return getter(visitor)(self, **kw)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in visit_clauselist
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 475, in <genexpr>
s for s in
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in <genexpr>
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 72, in _compiler_dispatch
return getter(visitor)(self, **kw)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in visit_clauselist
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 475, in <genexpr>
s for s in
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in <genexpr>
for c in clauselist.clauses)
...
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 475, in <genexpr>
s for s in
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in <genexpr>
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 72, in _compiler_dispatch
return getter(visitor)(self, **kw)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in visit_clauselist
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 475, in <genexpr>
s for s in
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/compiler.py", line 477, in <genexpr>
for c in clauselist.clauses)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 72, in _compiler_dispatch
return getter(visitor)(self, **kw)
RuntimeError: maximum recursion depth exceeded