Skip to content

sqlalchemy_utils generic_repr breaks repr for gino models #16

@asfaltboy

Description

@asfaltboy

While playing around with the gino ORM on the shell, I kept encountering the NoInspectionAvailable error.
Eventually, I traced this back to @generic_repr decorator and removing it fixed the problem.
Here is the full stack trace:

In [1]: from app.settings.globals import ARQ_BACKGROUND_FUNCTIONS, DATABASE_CONFIG
   ...: from app.models.orm.user import User
   ...: from app.application import app, db
   ...: await db.set_bind(DATABASE_CONFIG.url)
   ...: await User.get(1)
Out[1]: -------------------------------------------------
NoInspectionAvailable                     Traceback (most recent call last)
  /my_env/lib/python3.8/site-packages/IPython/core/formatters.py(702)__call__()
    700                 type_pprinters=self.type_printers,
    701                 deferred_pprinters=self.deferred_printers)
--> 702             printer.pretty(obj)
    703             printer.flush()
    704             return stream.getvalue()

  /my_env/lib/python3.8/site-packages/IPython/lib/pretty.py(394)pretty()
    392                         if cls is not object \
    393                                 and callable(cls.__dict__.get('__repr__')):
--> 394                             return _repr_pprint(obj, self, cycle)
    395
    396             return _default_pprint(obj, self, cycle)

  /my_env/lib/python3.8/site-packages/IPython/lib/pretty.py(700)_repr_pprint()
    698     """A pprint that just redirects to the normal repr function."""
    699     # Find newlines and replace them with p.break_()
--> 700     output = repr(obj)
    701     lines = output.splitlines()
    702     with p.group():

  /my_env/lib/python3.8/site-packages/sqlalchemy_utils/models.py(89)<lambda>()
     87     if len(fields) == 1 and callable(fields[0]):
     88         target = fields[0]
---> 89         target.__repr__ = lambda self: _generic_repr_method(self, fields=None)
     90         return target
     91     else:

  /my_env/lib/python3.8/site-packages/sqlalchemy_utils/models.py(42)_generic_repr_method()
     40
     41 def _generic_repr_method(self, fields):
---> 42     state = sa.inspect(self)
     43     field_reprs = []
     44     if not fields:

> /my_env/lib/python3.8/site-packages/sqlalchemy/inspection.py(71)inspect()
     69
     70     if raiseerr and (reg is None or ret is None):
---> 71         raise exc.NoInspectionAvailable(
     72             "No inspection system is "
     73             "available for object of type %s" % type_

NoInspectionAvailable: No inspection system is available for object of type <class 'app.models.orm.user.User'>```

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions