On Wed, Oct 25, 2017 at 9:25 AM, Антонио Антуан <a.ch....@gmail.com> wrote: > As I said befire, sqlalchemy version: 1.0.19 and code is here: > https://gist.github.com/aCLr/113ac292c05bdb01e964d8e9884d6e5f
I apologize, did not see that link. Use the execute_and_instances() implemenation from lib/sqlalchemy/orm/query.py, which means here use _bind_mapper(): def _execute_and_instances(self, querycontext): self._check_bound_to_shard() querycontext.attributes['shard_id'] = self._shard_id result = self._connection_from_session( mapper=self._bind_mapper(), shard_id=self._shard_id).execute( querycontext.statement, self._params ) return self.instances(result, querycontext) > > Currently I can't use another version. In that case, I think that here is > the right decision: > "Looks like I have to check if "_mapper_zero()" returns real mapper. > Otherwise I should pass "None" to "_connection_from_session()" as value of > "mapper" argument" > > Am I right? > > > ср, 25 окт. 2017 г. в 16:18, Mike Bayer <mike...@zzzcomputing.com>: >> >> On Wed, Oct 25, 2017 at 6:52 AM, Антонио Антуан <a.ch....@gmail.com> >> wrote: >> > Any news here? >> >> We would require a self-contained demonstration case that illustrates >> your error as well as complete information on what specific SQLAlchemy >> version you are targeting. As mentioned in a different reply, >> _mapper_zero has been fixed in 1.1 to always return a mapper. I >> would strongly advise targeting the 1.1 series for any new development >> as that's where issues can still be fixed. >> >> >> >> >> >> > >> > суббота, 21 октября 2017 г., 18:42:47 UTC+3 пользователь Антонио Антуан >> > написал: >> >> >> >> I see that it is not happened when "bind" passed directly to >> >> "sessionmaker" >> >> >> >> сб, 21 окт. 2017 г. в 18:33, Антонио Антуан <a.ch....@gmail.com>: >> >>> >> >>> >> >>> >> >>> пятница, 20 октября 2017 г., 20:50:52 UTC+3 пользователь Mike Bayer >> >>> написал: >> >>>> >> >>>> On Fri, Oct 20, 2017 at 11:05 AM, Simon King <si...@simonking.org.uk> >> >>>> wrote: >> >>>> > The "is not None" is important when checking a variable that may >> >>>> > contain a ClauseElement, precisely because ClauseElement defines >> >>>> > that >> >>>> > __bool__ method. >> >>>> > >> >>>> > However, in Session.get_bind(), "mapper" is not supposed to contain >> >>>> > a >> >>>> > ClauseElement. It should either be an instance of >> >>>> > sqlalchemy.orm.mapper.Mapper, or None, in which case "if mapper:" >> >>>> > is a >> >>>> > valid and concise way to write it. Comparing to None might be >> >>>> > strictly >> >>>> > more accurate, but it shouldn't be necessary. >> >>>> >> >>>> agree, "mapper" means "mapper" and it is not supposed to be a >> >>>> ClauseElement. This sounds like arguments are not being passed >> >>>> correctly somewhere. Would need a demonstration script if something >> >>>> in SQLAlchemy itself is claimed to be making the mistake. >> >>> >> >>> >> >>> Ok, that code produces mentioned error: >> >>> https://gist.github.com/aCLr/113ac292c05bdb01e964d8e9884d6e5f >> >>> Traceback (most recent call last): >> >>> File "/home/anton/Projects/proj/core/run/stuff.py", line 100, in >> >>> <module> >> >>> Session.query(with_recursive).set_shard('default').all() >> >>> File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/query.py", line >> >>> 2654, >> >>> in all >> >>> File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/query.py", line >> >>> 2802, >> >>> in __iter__ >> >>> File "/home/anton/Projects/proj/core/run/stuff.py", line 28, in >> >>> _execute_and_instances >> >>> shard_id=self._shard_id).execute( >> >>> File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/query.py", line >> >>> 2806, >> >>> in _connection_from_session >> >>> File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/session.py", line >> >>> 984, in connection >> >>> File "/home/anton/Projects/proj/core/run/stuff.py", line 40, in >> >>> get_bind >> >>> original_bind = super(RoutingSession, self).get_bind(mapper, >> >>> clause) >> >>> File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/session.py", line >> >>> 1336, in get_bind >> >>> File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/elements.py", line >> >>> 539, in __bool__ >> >>> TypeError: Boolean value of this clause is not defined >> >>> >> >>>> >> >>>> > >> >>>> > Simon >> >>>> >> >>>> > >> >>>> > >> >>>> > >> >>>> > On Fri, Oct 20, 2017 at 3:17 PM, Антонио Антуан <a.ch...@gmail.com> >> >>>> > wrote: >> >>>> >> Really, `mapper` contains this: <sqlalchemy.sql.selectable.CTE at >> >>>> >> 0x7fe673fb0a50; group_getter>. But does it changes something? I >> >>>> >> already >> >>>> >> encountered this problem in my code, when I checked sqla-objects >> >>>> >> existance >> >>>> >> without "is not None", project was broken. Is it normal to omit >> >>>> >> that >> >>>> >> condition in sqlalchemy code? >> >>>> >> >> >>>> >> I use: >> >>>> >>>>> sqlalchemy.__version__ >> >>>> >> '1.0.19' >> >>>> >> >> >>>> >> пятница, 20 октября 2017 г., 16:42:23 UTC+3 пользователь Simon >> >>>> >> King >> >>>> >> написал: >> >>>> >>> >> >>>> >>> On Fri, Oct 20, 2017 at 2:15 PM, Антонио Антуан >> >>>> >>> <a.ch...@gmail.com> >> >>>> >>> wrote: >> >>>> >>> > Hi. >> >>>> >>> > I use my own `RoutingSession` and `RoutingQuery` >> >>>> >>> > implementation, >> >>>> >>> > most of >> >>>> >>> > it >> >>>> >>> > inspired by `sqlalchemy.ext.horizontal_shard`: >> >>>> >>> > >> >>>> >>> > class RoutingSession(Session): >> >>>> >>> > def get_bind(self, mapper=None, clause=None, shard_id=None, >> >>>> >>> > **kwargs): >> >>>> >>> > original_bind = None >> >>>> >>> > try: >> >>>> >>> > original_bind = super(RoutingSession, >> >>>> >>> > self).get_bind(mapper, >> >>>> >>> > clause) >> >>>> >>> > except UnboundExecutionError: >> >>>> >>> > # may not be bound >> >>>> >>> > pass >> >>>> >>> > if shard_id is None: >> >>>> >>> > shard_id = TenantIDStorage.get_shard_id() # just >> >>>> >>> > global >> >>>> >>> > storage >> >>>> >>> > bind_for_shard = self.__binds[shard_id] >> >>>> >>> > if original_bind is not None and original_bind.url == >> >>>> >>> > bind_for_shard.url: >> >>>> >>> > return original_bind >> >>>> >>> > else: >> >>>> >>> > return bind_for_shard >> >>>> >>> > >> >>>> >>> > def __init__(self, shards=None, query_cls=CachingQuery, >> >>>> >>> > engines_factory=None, **kwargs): >> >>>> >>> > super(RoutingSession, >> >>>> >>> > self).__init__(query_cls=query_cls, >> >>>> >>> > **kwargs) >> >>>> >>> > self.__binds = {} >> >>>> >>> > self.engines_factory = engines_factory >> >>>> >>> > if shards is not None: >> >>>> >>> > self.update_shards(**shards) >> >>>> >>> > >> >>>> >>> > def _add_bind(self, key, bind): >> >>>> >>> > self.__binds[key] = bind >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > class RoutingQuery(Query): >> >>>> >>> > def __init__(self, *args, **kwargs): >> >>>> >>> > super(RoutingQuery, self).__init__(*args, **kwargs) >> >>>> >>> > self._shard_id = TenantIDStorage.get_shard_id() >> >>>> >>> > >> >>>> >>> > def get(self, ident): >> >>>> >>> > self._check_bound_to_shard() >> >>>> >>> > return super(CachingQuery, self).get(ident) >> >>>> >>> > >> >>>> >>> > def _check_bound_to_shard(self): >> >>>> >>> > if self._shard_id is None: >> >>>> >>> > raise ValueError('query not bound to any shard') >> >>>> >>> > >> >>>> >>> > def _execute_and_instances(self, querycontext): >> >>>> >>> > self._check_bound_to_shard() >> >>>> >>> > querycontext.attributes['shard_id'] = self._shard_id >> >>>> >>> > result = self._connection_from_session( >> >>>> >>> > mapper=self._mapper_zero(), >> >>>> >>> > shard_id=self._shard_id).execute( >> >>>> >>> > querycontext.statement, >> >>>> >>> > self._params >> >>>> >>> > ) >> >>>> >>> > return self.instances(result, querycontext) >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > Sometimes I got this error: >> >>>> >>> > >> >>>> >>> > File >> >>>> >>> > "/home/anton/Projects/proj/admin/proj/admin/views/stats.py", >> >>>> >>> > line >> >>>> >>> > 898, in _get_filters_from_request >> >>>> >>> > control_groups = [g.id for g in >> >>>> >>> > User.get_own_groups_query(current_user.id)] >> >>>> >>> > File >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py", >> >>>> >>> > line 2802, in __iter__ >> >>>> >>> > return self._execute_and_instances(context) >> >>>> >>> > File >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > "/home/anton/Projects/proj/core/proj/core/orm_extensions/rouing_session.py", >> >>>> >>> > line 105, in _execute_and_instances >> >>>> >>> > shard_id=self._shard_id).execute( >> >>>> >>> > File >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py", >> >>>> >>> > line 2806, in _connection_from_session >> >>>> >>> > **kw) >> >>>> >>> > File >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", >> >>>> >>> > line 984, in connection >> >>>> >>> > bind = self.get_bind(mapper, clause=clause, **kw) >> >>>> >>> > File >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > "/home/anton/Projects/proj/core/proj/core/orm_extensions/cachingquery.py", >> >>>> >>> > line 279, in get_bind >> >>>> >>> > original_bind = super(RoutingSession, >> >>>> >>> > self).get_bind(mapper, >> >>>> >>> > clause) >> >>>> >>> > File >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", >> >>>> >>> > line 1336, in get_bind >> >>>> >>> > if mapper and mapper.mapped_table.bind: >> >>>> >>> > File >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", >> >>>> >>> > line 539, in __bool__ >> >>>> >>> > raise TypeError("Boolean value of this clause is not >> >>>> >>> > defined") >> >>>> >>> > TypeError: Boolean value of this clause is not defined >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > >> >>>> >>> > I found that `mapper` in original `get_bind` always checks with >> >>>> >>> > `is not >> >>>> >>> > None` condition. There is only one place where condition >> >>>> >>> > omitted: >> >>>> >>> > `if >> >>>> >>> > mapper >> >>>> >>> > and mapper.mapped_table.bind...`. >> >>>> >>> > Possibly it is not correct? Or my code does not do something >> >>>> >>> > important? >> >>>> >>> >> >>>> >>> Are you able to catch this error in a debugger? >> >>>> >>> >> >>>> >>> I'm going to make a wild guess that "mapper" at this point is >> >>>> >>> some >> >>>> >>> sort of SQL construct (such as a column object or mapped >> >>>> >>> property), >> >>>> >>> rather than an actual mapper. >> >>>> >>> >> >>>> >>> You don't say which version of SQLAlchemy you are using, but >> >>>> >>> since >> >>>> >>> you've overridden _execute_and_instances, I wonder if you need to >> >>>> >>> use >> >>>> >>> something like query._bind_mapper() as used by _get_bind_args: >> >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> <https://bitbucket.org/zzzeek/sqlalchemy/src/4b22b01ade6f94cc4db2f2040c802067a25d29a4/lib/sqlalchemy/orm/query.py?at=rel_1_1_14&fileviewer=file-view-default#query.py-2872> >> >>>> >>> >> >>>> >>> Hope that helps, >> >>>> >>> >> >>>> >>> Simon >> >>>> >> >> >>>> >> -- >> >>>> >> SQLAlchemy - >> >>>> >> The Python SQL Toolkit and Object Relational Mapper >> >>>> >> >> >>>> >> http://www.sqlalchemy.org/ >> >>>> >> >> >>>> >> To post example code, please provide an MCVE: Minimal, Complete, >> >>>> >> and >> >>>> >> Verifiable Example. See http://stackoverflow.com/help/mcve for a >> >>>> >> full >> >>>> >> description. >> >>>> >> --- >> >>>> >> 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 sqlalchemy+...@googlegroups.com. >> >>>> >> To post to this group, send email to sqlal...@googlegroups.com. >> >>>> >> >>>> >> Visit this group at https://groups.google.com/group/sqlalchemy. >> >>>> >> For more options, visit https://groups.google.com/d/optout. >> >>>> > >> >>>> > -- >> >>>> > SQLAlchemy - >> >>>> > The Python SQL Toolkit and Object Relational Mapper >> >>>> > >> >>>> > http://www.sqlalchemy.org/ >> >>>> > >> >>>> > To post example code, please provide an MCVE: Minimal, Complete, >> >>>> > and >> >>>> > Verifiable Example. See http://stackoverflow.com/help/mcve for a >> >>>> > full >> >>>> > description. >> >>>> > --- >> >>>> > 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 sqlalchemy+...@googlegroups.com. >> >>>> > To post to this group, send email to sqlal...@googlegroups.com. >> >>>> >> >>>> > Visit this group at https://groups.google.com/group/sqlalchemy. >> >>>> > For more options, visit https://groups.google.com/d/optout. >> >>> >> >>> -- >> >>> SQLAlchemy - >> >>> The Python SQL Toolkit and Object Relational Mapper >> >>> >> >>> http://www.sqlalchemy.org/ >> >>> >> >>> To post example code, please provide an MCVE: Minimal, Complete, and >> >>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> >>> description. >> >>> --- >> >>> 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 sqlalchemy+unsubscr...@googlegroups.com. >> >>> To post to this group, send email to sqlalchemy@googlegroups.com. >> >>> Visit this group at https://groups.google.com/group/sqlalchemy. >> >>> For more options, visit https://groups.google.com/d/optout. >> >> >> >> -- >> >> >> >> Антон >> > >> > -- >> > SQLAlchemy - >> > The Python SQL Toolkit and Object Relational Mapper >> > >> > http://www.sqlalchemy.org/ >> > >> > To post example code, please provide an MCVE: Minimal, Complete, and >> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> > description. >> > --- >> > 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 sqlalchemy+unsubscr...@googlegroups.com. >> > To post to this group, send email to sqlalchemy@googlegroups.com. >> > Visit this group at https://groups.google.com/group/sqlalchemy. >> > For more options, visit https://groups.google.com/d/optout. >> >> -- >> SQLAlchemy - >> The Python SQL Toolkit and Object Relational Mapper >> >> http://www.sqlalchemy.org/ >> >> To post example code, please provide an MCVE: Minimal, Complete, and >> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> description. >> --- >> 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 sqlalchemy+unsubscr...@googlegroups.com. >> To post to this group, send email to sqlalchemy@googlegroups.com. >> Visit this group at https://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. > > -- > > Антон > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > 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 sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.