Skip to content

baked get() implementation needs to consider mapper._get_clause as part of key #3597

@sqlalchemy-bot

Description

@sqlalchemy-bot

Migrated issue, originally created by Taha Jahangir

Envrionment: CentOS 7 / Python 3.4.2 / SQL Alchemy 1.0.9
App details: uwsgi web app running in multi-process and multi-thread mode (5 thread per process)

It seems it's a race condition in baked query loading (both in baked relations and explicit baked queries) causes these StatementError errors:

Traceback (most recent call last):
  File "site-packages/sqlalchemy/engine/base.py", line 1073, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "site-packages/sqlalchemy/engine/default.py", line 552, in _init_compiled
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/engine/default.py", line 552, in <listcomp>
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/sql/compiler.py", line 476, in construct_params
    % bindparam.key)
sqlalchemy.exc.InvalidRequestError: A value is required for bind parameter '%(140719693927088 param)s'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "query.py", line 146, in baked_get
    return baked_query.get(ident)
  File "site-packages/sqlalchemy/ext/baked.py", line 322, in get
    return query._get_impl(ident, self._load_on_ident)
  File "site-packages/sqlalchemy/orm/query.py", line 862, in _get_impl
    return fallback_fn(self, key)
  File "site-packages/sqlalchemy/ext/baked.py", line 365, in _load_on_ident
    result = list(bq.for_session(self.session).params(**params))
  File "site-packages/sqlalchemy/ext/baked.py", line 254, in __iter__
    with_session(self.session)._execute_and_instances(context)
  File "site-packages/sqlalchemy/orm/query.py", line 2586, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "site-packages/sqlalchemy/engine/base.py", line 914, in execute
    return meth(self, multiparams, params)
  File "site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
    compiled_sql, distilled_params
  File "site-packages/sqlalchemy/engine/base.py", line 1078, in _execute_context
    None, None)
  File "site-packages/sqlalchemy/engine/base.py", line 1341, in _handle_dbapi_exception
    exc_info
  File "site-packages/sqlalchemy/util/compat.py", line 188, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
  File "site-packages/sqlalchemy/util/compat.py", line 181, in reraise
    raise value.with_traceback(tb)
  File "site-packages/sqlalchemy/engine/base.py", line 1073, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "site-packages/sqlalchemy/engine/default.py", line 552, in _init_compiled
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/engine/default.py", line 552, in <listcomp>
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/sql/compiler.py", line 476, in construct_params
    % bindparam.key)
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter '%(140719693927088 param)s' [SQL: 'SELECT table.col1 AS table_col1, ..., table.col7 AS table_col7 \nFROM table \nWHERE table.col1 = %(param_1)s AND table.col2 = %(param_2)s'] [parameters: [{'%(140719693926920 param)s': 79228, '%(140719693926640 param)s': 90033}]]

And similarly in:

Traceback (most recent call last):
  File "site-packages/sqlalchemy/engine/base.py", line 1073, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "site-packages/sqlalchemy/engine/default.py", line 552, in _init_compiled
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/engine/default.py", line 552, in <listcomp>
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/sql/compiler.py", line 476, in construct_params
    % bindparam.key)
sqlalchemy.exc.InvalidRequestError: A value is required for bind parameter '%(139926623193184 param)s'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "template.py", line 202, in template
    tabl1_obj = obj.tabl1_relation
  File "site-packages/sqlalchemy/orm/attributes.py", line 237, in __get__
    return self.impl.get(instance_state(instance), dict_)
  File "site-packages/sqlalchemy/orm/attributes.py", line 583, in get
    value = self.callable_(state, passive)
  File "site-packages/sqlalchemy/orm/strategies.py", line 532, in _load_for_state
    return self._emit_lazyload(session, state, ident_key, passive)
  File "site-packages/sqlalchemy/ext/baked.py", line 450, in _emit_lazyload
    session.query(self.mapper), ident_key)
  File "site-packages/sqlalchemy/ext/baked.py", line 365, in _load_on_ident
    result = list(bq.for_session(self.session).params(**params))
  File "site-packages/sqlalchemy/ext/baked.py", line 254, in __iter__
    with_session(self.session)._execute_and_instances(context)
  File "site-packages/sqlalchemy/orm/query.py", line 2586, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "site-packages/sqlalchemy/engine/base.py", line 914, in execute
    return meth(self, multiparams, params)
  File "site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
    compiled_sql, distilled_params
  File "site-packages/sqlalchemy/engine/base.py", line 1078, in _execute_context
    None, None)
  File "site-packages/sqlalchemy/engine/base.py", line 1341, in _handle_dbapi_exception
    exc_info
  File "site-packages/sqlalchemy/util/compat.py", line 188, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
  File "site-packages/sqlalchemy/util/compat.py", line 181, in reraise
    raise value.with_traceback(tb)
  File "site-packages/sqlalchemy/engine/base.py", line 1073, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "site-packages/sqlalchemy/engine/default.py", line 552, in _init_compiled
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/engine/default.py", line 552, in <listcomp>
    grp, m in enumerate(parameters)]
  File "site-packages/sqlalchemy/sql/compiler.py", line 476, in construct_params
    % bindparam.key)
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter '%(139926623193184 param)s' [SQL: 'SELECT table1.col1 AS table1_col1, ..., table1.col20 AS table1_col20 \nFROM table1 \nWHERE table1.id = %(param_1)s'] [parameters: [{'%(139926623194696 param)s': 86317}]]

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingsqlalchemy.extextension modules, most of which are ORM related

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions