SQLAlchemy query sometimes throws StatementError
I have a Flask application that uses SQLAlchemy connected to a mysql db running on my production server (Ubuntu machine).
75% of the time, when I issue a specific POST request, the application raises a StatementError with the following glass.
[2015-06-18 17:25:46,512] {/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/flask/app.py:1423} ERROR - Exception on /conjugate/conjugate [POST]
Traceback (most recent call last):
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "./conjugate.py", line 169, in conjugate
for translation in get_translations(lang, verb)],
File "./conjugate.py", line 80, in get_translations
for entry in session.query(Translation).filter_by(lang=lang, english=english):
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2515, in __iter__
return self._execute_and_instances(context)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2530, in _execute_and_instances
result = conn.execute(querycontext.statement, self._params)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 914, in execute
return meth(self, multiparams, params)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
compiled_sql, distilled_params
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1078, in _execute_context
None, None)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1339, in _handle_dbapi_exception
exc_info
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1071, in _execute_context
conn = self._revalidate_connection()
File "/home/dsaltares/conjugate/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 391, in _revalidate_connection
"Can't reconnect until invalid "
StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back [SQL: u'SELECT translations.lang AS translations_lang, translat ions.verb AS translations_verb, translations.english AS translations_english, translations.description AS translations_description \nFROM translations \nWHERE translations.l ang = %s AND translations.english = %s'] [parameters: [immutabledict({})]]
The other 25% of the queries work very well and it returns the expected data. These requests are spaced out in time, it does not seem like someone is cheating the service.
The request fails in is
try:
for entry in session.query(Translation).filter_by(lang=lang, english=english):
translations.append({
'lang': lang,
'english': english,
'verb': entry.verb,
'description': entry.description
})
except:
app.logger.error('Error querying translations for (%s, %s)\n%s' % (lang, english, traceback.format_exc()))
raise
Translation converter:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class Translation(Base):
__tablename__ = 'translations'
lang = Column(String(10), primary_key=True)
verb = Column(String(25), primary_key=True)
english = Column(String(25), primary_key=True)
description = Column(String)
def __repr__(self):
return "<Translation(lang='%s', verb='%s', english='%s'>" % (self.lang, self.verb, self.english)
Any ideas as to what this might be? Do I need to provide additional information?
+3
source to share
No one has answered this question yet
Check out similar questions: