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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/36d0bc21-98b3-46ef-9085-c786f98234fen%40googlegroups.com.

Reply via email to