Hello Mike. Finally got to this. Works perfectly with synchronize_session equals False or 'evaluate'.
Got a problem when synchronize_session='fetch'. In that case used BulkFetch._do_pre_synchronize (as you know :)). There is query instance with set `_bind_id` attribute, but it don't passed through `execute`. Here is an example that can illustrate that problem: https://gist.github.com/aCLr/a992ca92138aeee86bf9432693be6d6c It contains Query and Session implementations, which used in my project: MultiBoundQuery and MultiBoundSession. Also, it contains `delete` and `update` execution and checking for update and delete operation. Tracebacks included. вт, 13 февр. 2018 г. в 20:37, Антонио Антуан <[email protected]>: > I understand. Excuse me, drown in work. Going to test your code in a > couple of days. > > вт, 13 февр. 2018 г., 20:32 Mike Bayer <[email protected]>: > >> i don't plan to move on this until I get feedback. >> >> On Tue, Feb 6, 2018 at 7:32 PM, Mike Bayer <[email protected]> >> wrote: >> > code review at >> https://gerrit.sqlalchemy.org/#/c/zzzeek/sqlalchemy/+/656 >> > and ideally would include basic ShardedQuery support >> > >> > On Tue, Feb 6, 2018 at 7:23 PM, Mike Bayer <[email protected]> >> wrote: >> >> On Tue, Feb 6, 2018 at 5:09 PM, Антонио Антуан <[email protected]> >> wrote: >> >>> Hello Mike! >> >>> First of all, thank you for your help with this problem. Me and my >> crew >> >>> appreciate it. >> >>> >> >>> >> >>> I have a question in case of `identity_token` for `update` and >> `delete` >> >>> methods of `Query` instances. >> >>> >> >>> If we take a look on sqlalchemy.orm.persistence.BulkDelete._do_exec, >> we see, >> >>> that there is no additonal kwargs passed to `execute` method. So I >> don't see >> >>> any way to pass additional kwargs to Session.get_bind. Here is code >> of 1.0 >> >>> version: >> >>> >> >>> def _do_exec(self): >> >>> delete_stmt = sql.delete(self.primary_table, >> >>> self.context.whereclause) >> >>> >> >>> self.result = self.query.session.execute( >> >>> delete_stmt, >> >>> params=self.query._params, >> >>> mapper=self.mapper, >> >>> # need to pass here additional kwargs >> >>> ) >> >>> self.rowcount = self.result.rowcount >> >>> >> >>> Code from master branch (almost the same): >> >>> >> >>> def _execute_stmt(self, stmt): >> >>> self.result = self.query.session.execute( >> >>> stmt, params=self.query._params, >> >>> mapper=self.mapper) >> >>> self.rowcount = self.result.rowcount >> >>> >> >>> >> >>> >> >>> >> >>> As you may remember, I have some kind of `CustomQuery` with `set_bind` >> >>> method (like the same into >> sqlalchemy.ext.horizontal_shard.ShardedQuery). So >> >>> I have `_bind_id` attribute within instances of that class. >> >>> My question is: Is there any way to pass `self.query._bind_id` to >> >>> `self.query.session.execute` (see above)? >> >> >> >> for bulk operations to work with sharding it would need to be able to >> >> emit the UPDATE or DELETE statement across multiple shards and work in >> >> a similar way to ShardedQuery._execute_and_instances, giving it the >> >> chance to consult with query_chooser. >> >> >> >> can you please see if you can work with this? thanks >> >> >> >> diff --git a/lib/sqlalchemy/orm/persistence.py >> >> b/lib/sqlalchemy/orm/persistence.py >> >> index dc0ae1c38..6c55dee92 100644 >> >> --- a/lib/sqlalchemy/orm/persistence.py >> >> +++ b/lib/sqlalchemy/orm/persistence.py >> >> @@ -1327,9 +1327,8 @@ class BulkUD(object): >> >> self._do_post() >> >> >> >> def _execute_stmt(self, stmt): >> >> - self.result = self.query.session.execute( >> >> - stmt, params=self.query._params, >> >> - mapper=self.mapper) >> >> + self.result = self.query._execute_crud(stmt, self.mapper) >> >> + >> >> self.rowcount = self.result.rowcount >> >> >> >> @util.dependencies("sqlalchemy.orm.query") >> >> diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py >> >> index 4f7b22cc9..91adfb79d 100644 >> >> --- a/lib/sqlalchemy/orm/query.py >> >> +++ b/lib/sqlalchemy/orm/query.py >> >> @@ -2901,6 +2901,12 @@ class Query(object): >> >> result = conn.execute(querycontext.statement, self._params) >> >> return loading.instances(querycontext.query, result, >> querycontext) >> >> >> >> + def _execute_crud(self, stmt, mapper): >> >> + conn = self._connection_from_session( >> >> + mapper=mapper, clause=stmt, close_with_result=True) >> >> + >> >> + return conn.execute(stmt, self._params) >> >> + >> >> def _get_bind_args(self, querycontext, fn, **kw): >> >> return fn( >> >> mapper=self._bind_mapper(), >> >> >> >> >> >> >> >> >> >> >> >> >> >>> >> >>> -- >> >>> 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 [email protected]. >> >>> To post to this group, send email to [email protected]. >> >>> 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 [email protected]. >> To post to this group, send email to [email protected]. >> 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
