Any news here? суббота, 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.