thanks! On Sun, May 14, 2023, at 6:59 PM, Shane Holcombe wrote: > I've tested all the ways I could previously trigger the issue and still, no > Nones seem to even be produced to be filtered out, that fix definitely seems > to have sorted the issue out > > On Sunday, May 14, 2023 at 7:42:54 AM UTC+10 Shane Holcombe wrote: >> Yes so I'm testing the second solution with a breakpoint on the area that >> should filter out those Nones, I wanted to see wether the Nones are being >> removed or are no longer showing up. So far I haven't seen that code be >> used, which is great, means the race condition thing must have helped. I >> can't be 100% sure as it was hard to trigger but I haven't managed to just >> yet and I've tried what usually caused the issue. I'll keep testing some >> more and let you know if it shows up again but this seems much better, thank >> so much. >> >> On Sunday, May 14, 2023 at 2:37:37 AM UTC+10 Mike Bayer wrote: >>> __ >>> the second solution has not only the removal of where the theoretical "race >>> condition" might happen, but it also removes the "None" entries in any >>> case, so even if the "None" thing is coming from somewhere else, they won't >>> make it to the select() statement at the end. >>> >>> On Sat, May 13, 2023, at 3:36 AM, Shane Holcombe wrote: >>>> I've tested both solutions, the first one, moving the if c is None: return >>>> down a few lines seems to work and the generated SQL still seems to be >>>> correct in the instances where that code is triggered. >>>> From some early testing as well the other solution seems to work as well, >>>> it's hard to test 100% as this was always a bit troublesome to replicate, >>>> I had a series of events that seemed to trigger it somewhat regularly and >>>> it hasn't yet. >>>> The idea this might be a race condition does make sense as the model that >>>> seems to more often than not return the missing columns is used basically >>>> everywhere and will be joined to from other models very frequently, often >>>> multiple times from the same query, with multiple different queries on a >>>> page load, the 'xx_application_user' model in the query I sent. >>>> I'll test it again a few more times/ways later tonight/tomorrow morning >>>> when I get a chance again and let you know >>>> Thanks so much >>>> On Saturday, May 13, 2023 at 1:50:56 PM UTC+10 Mike Bayer wrote: >>>>> __ >>>>> in the below mentioned issue I've created a patch at >>>>> https://gerrit.sqlalchemy.org/c/sqlalchemy/sqlalchemy/+/4615 that removes >>>>> a thread-sensitive approach to generating an internal structure, which is >>>>> where I suspect this might be happening (if anywhere), and then it also >>>>> adds a guard against the None objects in any case. you'd want to take >>>>> a look at that and see if it resolves. >>>>> >>>>> On Fri, May 12, 2023, at 11:30 PM, Mike Bayer wrote: >>>>>> I've opened https://github.com/sqlalchemy/sqlalchemy/issues/9777 for >>>>>> this. >>>>>> >>>>>> I have another theory where something might be going wrong earler in the >>>>>> chain. This change would be "simpler" in that it removes something >>>>>> that's complicated, prone to race conditions hence seems a good >>>>>> possibility of being involved here. This would be the patch: >>>>>> >>>>>> diff --git a/lib/sqlalchemy/orm/strategies.py >>>>>> b/lib/sqlalchemy/orm/strategies.py >>>>>> index 8e06c4f598..bd0193b905 100644 >>>>>> --- a/lib/sqlalchemy/orm/strategies.py >>>>>> +++ b/lib/sqlalchemy/orm/strategies.py >>>>>> @@ -2324,8 +2324,7 @@ class JoinedLoader(AbstractRelationshipLoader): >>>>>> else: >>>>>> context.attributes[key] = idx = context.attributes[key] + 1 >>>>>> >>>>>> - if idx >= len(self._aliased_class_pool): >>>>>> - to_adapt = orm_util.AliasedClass( >>>>>> + return orm_util.AliasedClass( >>>>>> self.mapper, >>>>>> alias=alt_selectable._anonymous_fromclause(flat=True) >>>>>> if alt_selectable is not None >>>>>> @@ -2334,14 +2333,6 @@ class JoinedLoader(AbstractRelationshipLoader): >>>>>> use_mapper_path=True, >>>>>> ) >>>>>> >>>>>> - # load up the .columns collection on the Alias() before >>>>>> - # the object becomes shared among threads. this prevents >>>>>> - # races for column identities. >>>>>> - inspect(to_adapt).selectable.c >>>>>> - self._aliased_class_pool.append(to_adapt) >>>>>> - >>>>>> - return self._aliased_class_pool[idx] >>>>>> - >>>>>> def _generate_row_adapter( >>>>>> self, >>>>>> compile_state, >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Fri, May 12, 2023, at 11:05 PM, Shane Holcombe wrote: >>>>>>> There seems to be a few moving parts to this so it's been hard to track >>>>>>> down, I can give that fix a try in a few hours when I'm home. >>>>>>> I was worried something like that might lose some columns but I'll try >>>>>>> and see what happens. >>>>>>> Thanks >>>>>>> On Saturday, May 13, 2023 at 12:59:33 PM UTC+10 Mike Bayer wrote: >>>>>>>> __ >>>>>>>> well, not sure yet how a None is coming in there that is sporadic, or >>>>>>>> even at all, but if that's what's happening then we would think this >>>>>>>> patch would fix the problem, the Q is does the query still produce the >>>>>>>> correct results: >>>>>>>> >>>>>>>> diff --git a/lib/sqlalchemy/orm/strategies.py >>>>>>>> b/lib/sqlalchemy/orm/strategies.py >>>>>>>> index 8e06c4f598..2bac1aad48 100644 >>>>>>>> --- a/lib/sqlalchemy/orm/strategies.py >>>>>>>> +++ b/lib/sqlalchemy/orm/strategies.py >>>>>>>> @@ -218,10 +218,10 @@ class ColumnLoader(LoaderStrategy): >>>>>>>> if adapter: >>>>>>>> if check_for_adapt: >>>>>>>> c = adapter.adapt_check_present(c) >>>>>>>> - if c is None: >>>>>>>> - return >>>>>>>> else: >>>>>>>> c = adapter.columns[c] >>>>>>>> + if c is None: >>>>>>>> + return >>>>>>>> >>>>>>>> compile_state._append_dedupe_col_collection(c, >>>>>>>> column_collection) >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> can you try that patch ? >>>>>>>> >>>>>>>> >>>>>>>> On Fri, May 12, 2023, at 10:47 PM, Mike Bayer wrote: >>>>>>>>> OK, maybe you are onto something with the theory re: >>>>>>>>> JoinedLoader._generate_row_adapter(). will look at that >>>>>>>>> >>>>>>>>> On Fri, May 12, 2023, at 6:16 PM, Shane Holcombe wrote: >>>>>>>>>> Thanks for linking that github issue, completely missed that one. >>>>>>>>>> >>>>>>>>>> Here's the complete stack trace, sorry for not including that at the >>>>>>>>>> start >>>>>>>>>> >>>>>>>>>> Traceback (most recent call last): >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/werkzeug/serving.py", >>>>>>>>>> line 333, in run_wsgi >>>>>>>>>> execute(self.server.app) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/werkzeug/serving.py", >>>>>>>>>> line 320, in execute >>>>>>>>>> application_iter = app(environ, start_response) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask/app.py", line >>>>>>>>>> 2551, in __call__ >>>>>>>>>> return self.wsgi_app(environ, start_response) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask/app.py", line >>>>>>>>>> 2531, in wsgi_app >>>>>>>>>> response = self.handle_exception(e) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_cors/extension.py", >>>>>>>>>> line 165, in wrapped_function >>>>>>>>>> return cors_after_request(app.make_response(f(*args, **kwargs))) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_restx/api.py", >>>>>>>>>> line 673, in error_router >>>>>>>>>> return original_handler(f) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_restx/api.py", >>>>>>>>>> line 671, in error_router >>>>>>>>>> return self.handle_error(e) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask/app.py", line >>>>>>>>>> 2528, in wsgi_app >>>>>>>>>> response = self.full_dispatch_request() >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask/app.py", line >>>>>>>>>> 1825, in full_dispatch_request >>>>>>>>>> rv = self.handle_user_exception(e) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_cors/extension.py", >>>>>>>>>> line 165, in wrapped_function >>>>>>>>>> return cors_after_request(app.make_response(f(*args, **kwargs))) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_restx/api.py", >>>>>>>>>> line 673, in error_router >>>>>>>>>> return original_handler(f) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_restx/api.py", >>>>>>>>>> line 671, in error_router >>>>>>>>>> return self.handle_error(e) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask/app.py", line >>>>>>>>>> 1823, in full_dispatch_request >>>>>>>>>> rv = self.dispatch_request() >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask/app.py", line >>>>>>>>>> 1799, in dispatch_request >>>>>>>>>> return >>>>>>>>>> self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_restx/api.py", >>>>>>>>>> line 404, in wrapper >>>>>>>>>> resp = resource(*args, **kwargs) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask/views.py", >>>>>>>>>> line 107, in view >>>>>>>>>> return current_app.ensure_sync(self.dispatch_request)(**kwargs) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_restx/resource.py", >>>>>>>>>> line 46, in dispatch_request >>>>>>>>>> resp = meth(*args, **kwargs) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/flask_cors/decorator.py", >>>>>>>>>> line 128, in wrapped_function >>>>>>>>>> resp = make_response(f(*args, **kwargs)) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/PycharmProjects/vita/stockholm/geneva/api/auth.py", line >>>>>>>>>> 151, in decorated >>>>>>>>>> return f(*args, **kwargs) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/PycharmProjects/vita/stockholm/geneva/api/sales/lead_api.py", >>>>>>>>>> line 116, in get >>>>>>>>>> lead = lead_factory.extended_lead_for_id(lead_id) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/PycharmProjects/vita/stockholm/geneva/sales/lead_factory.py", >>>>>>>>>> line 59, in extended_lead_for_id >>>>>>>>>> return db.session.execute(stmt).scalar_one_or_none() >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/orm/scoping.py", >>>>>>>>>> line 724, in execute >>>>>>>>>> return self._proxied.execute( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/orm/session.py", >>>>>>>>>> line 2232, in execute >>>>>>>>>> return self._execute_internal( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/orm/session.py", >>>>>>>>>> line 2127, in _execute_internal >>>>>>>>>> result: Result[Any] = compile_state_cls.orm_execute_statement( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/orm/context.py", >>>>>>>>>> line 292, in orm_execute_statement >>>>>>>>>> result = conn.execute( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/engine/base.py", >>>>>>>>>> line 1413, in execute >>>>>>>>>> return meth( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", >>>>>>>>>> line 483, in _execute_on_connection >>>>>>>>>> return connection._execute_clauseelement( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/engine/base.py", >>>>>>>>>> line 1629, in _execute_clauseelement >>>>>>>>>> compiled_sql, extracted_params, cache_hit = >>>>>>>>>> elem._compile_w_cache( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", >>>>>>>>>> line 671, in _compile_w_cache >>>>>>>>>> compiled_sql = self._compiler( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", >>>>>>>>>> line 288, in _compiler >>>>>>>>>> return dialect.statement_compiler(dialect, self, **kw) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", >>>>>>>>>> line 1426, in __init__ >>>>>>>>>> Compiled.__init__(self, dialect, statement, **kwargs) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", >>>>>>>>>> line 867, in __init__ >>>>>>>>>> self.string = self.process(self.statement, **compile_kwargs) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", >>>>>>>>>> line 912, in process >>>>>>>>>> return obj._compiler_dispatch(self, **kwargs) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/visitors.py", >>>>>>>>>> line 143, in _compiler_dispatch >>>>>>>>>> return meth(self, **kw) # type: ignore # noqa: E501 >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", >>>>>>>>>> line 4593, in visit_select >>>>>>>>>> compile_state = select_stmt._compile_state_factory( >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/base.py", >>>>>>>>>> line 678, in create_for_statement >>>>>>>>>> return klass.create_for_statement(statement, compiler, **kw) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/orm/context.py", >>>>>>>>>> line 1101, in create_for_statement >>>>>>>>>> SelectState.__init__(self, self.statement, compiler, **kw) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py", >>>>>>>>>> line 4501, in __init__ >>>>>>>>>> self.froms = self._get_froms(statement) >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py", >>>>>>>>>> line 4599, in _get_froms >>>>>>>>>> [ >>>>>>>>>> File >>>>>>>>>> "/Users/sfh/env/vita/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py", >>>>>>>>>> line 4600, in <listcomp> >>>>>>>>>> element._from_objects >>>>>>>>>> AttributeError: 'NoneType' object has no attribute '_from_objects' >>>>>>>>>> In this case the statement we use, extended_lead_for_id, is >>>>>>>>>> >>>>>>>>>> from geneva.models import person_factory >>>>>>>>>> stmt = select(Lead).where(Lead.id == lead_id).options( >>>>>>>>>> joinedload(Lead.lead_person_client), >>>>>>>>>> joinedload(Lead.lead_person_primary_contact), >>>>>>>>>> joinedload(Lead.person), >>>>>>>>>> joinedload(Lead.person).joinedload(person_factory.Person.contract), >>>>>>>>>> joinedload(Lead.assigned_to_application_user), >>>>>>>>>> joinedload(Lead.in_progress_by_application_user), >>>>>>>>>> joinedload(Lead.closed_by_application_user), >>>>>>>>>> joinedload(Lead.lu_client_type), >>>>>>>>>> joinedload(Lead.lu_lead_origin_type), >>>>>>>>>> joinedload(Lead.lu_lead_status), >>>>>>>>>> joinedload(Lead.lu_lead_closed_state), >>>>>>>>>> joinedload(Lead.lu_lead_lost_reason), >>>>>>>>>> joinedload(Lead.lu_marketing_channel), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_digital), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_on_site), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_out_of_home), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_print), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_radio), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_referral), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_tv), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_paid_directory), >>>>>>>>>> joinedload(Lead.lu_marketing_channel_direct_mail), >>>>>>>>>> joinedload(Lead.referral_supplier), >>>>>>>>>> joinedload(Lead.council), >>>>>>>>>> joinedload(Lead.hospital), >>>>>>>>>> ) >>>>>>>>>> return db.session.execute(stmt).scalar_one_or_none() >>>>>>>>>> >>>>>>>>>> As for the models, we don't really use any default loaders on >>>>>>>>>> relationship creation, we've tended to avoid that and put the joins >>>>>>>>>> in the select statements we create >>>>>>>>>> If you really need to see a particular model from this let me know. >>>>>>>>>> >>>>>>>>>> Thanks again for the help >>>>>>>>>> On Saturday, May 13, 2023 at 1:28:27 AM UTC+10 Mike Bayer wrote: >>>>>>>>>>> __ >>>>>>>>>>> I really need to see: >>>>>>>>>>> >>>>>>>>>>> 1. actual models to the degree they illustrate the default loaders >>>>>>>>>>> set up on relationships >>>>>>>>>>> 2. query in use >>>>>>>>>>> 3. **complete** stack trace, put it on a github gist if it's too >>>>>>>>>>> long. every line, the error, top to bottom. thanks >>>>>>>>>>> >>>>>>>>>>> On Fri, May 12, 2023, at 11:25 AM, Mike Bayer wrote: >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Fri, May 12, 2023, at 1:25 AM, Shane Holcombe wrote: >>>>>>>>>>>>> AttributeError: 'NoneType' object has no attribute '_from_objects' >>>>>>>>>>>>> (I've shortened this from the entire traceback) >>>>>>>>>>>> >>>>>>>>>>>> OK what kind of traceback, is it a recursion overflow kind of >>>>>>>>>>>> traceback ? (e.g. many hundreds of repeated series of lines)? >>>>>>>>>>>> that would explain the nonsensical error at least (there's no way >>>>>>>>>>>> for None to be in the place that this error reports it) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> 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 view this discussion on the web visit >>>>>>>>>>>> https://groups.google.com/d/msgid/sqlalchemy/9762bf53-8443-4780-9091-136863716290%40app.fastmail.com >>>>>>>>>>>> >>>>>>>>>>>> <https://groups.google.com/d/msgid/sqlalchemy/9762bf53-8443-4780-9091-136863716290%40app.fastmail.com?utm_medium=email&utm_source=footer>. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> 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 view this discussion on the web visit >>>>>>>>>> https://groups.google.com/d/msgid/sqlalchemy/36d0bc21-98b3-46ef-9085-c786f98234fen%40googlegroups.com >>>>>>>>>> >>>>>>>>>> <https://groups.google.com/d/msgid/sqlalchemy/36d0bc21-98b3-46ef-9085-c786f98234fen%40googlegroups.com?utm_medium=email&utm_source=footer>. >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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 view this discussion on the web visit >>>>>>>>> https://groups.google.com/d/msgid/sqlalchemy/b84e367a-788e-4034-952d-3bc76c67d71c%40app.fastmail.com >>>>>>>>> >>>>>>>>> <https://groups.google.com/d/msgid/sqlalchemy/b84e367a-788e-4034-952d-3bc76c67d71c%40app.fastmail.com?utm_medium=email&utm_source=footer>. >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> 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 view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/sqlalchemy/d86f6a2d-b2c5-4d06-b9e9-f8e2977858bdn%40googlegroups.com >>>>>>> >>>>>>> <https://groups.google.com/d/msgid/sqlalchemy/d86f6a2d-b2c5-4d06-b9e9-f8e2977858bdn%40googlegroups.com?utm_medium=email&utm_source=footer>. >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 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 view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/sqlalchemy/8debdf3a-6097-44b6-998e-4011785b15b2%40app.fastmail.com >>>>>> >>>>>> <https://groups.google.com/d/msgid/sqlalchemy/8debdf3a-6097-44b6-998e-4011785b15b2%40app.fastmail.com?utm_medium=email&utm_source=footer>. >>>>> >>>> >>>> >>>> -- >>>> 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 view this discussion on the web visit >>>> https://groups.google.com/d/msgid/sqlalchemy/58c796ed-d9c2-4252-ac0c-51a9d54064edn%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/sqlalchemy/58c796ed-d9c2-4252-ac0c-51a9d54064edn%40googlegroups.com?utm_medium=email&utm_source=footer>. >>> > > > -- > 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 view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/2f84d244-5669-4914-8d12-df903d236befn%40googlegroups.com > > <https://groups.google.com/d/msgid/sqlalchemy/2f84d244-5669-4914-8d12-df903d236befn%40googlegroups.com?utm_medium=email&utm_source=footer>.
-- 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 view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/443787be-0c71-4476-bf12-1dcaae47c97f%40app.fastmail.com.