Subject: 'Psycopg2.errors' not referenced in packaged

From: Patrick Starrenburg <[email-masked]>
Date: Thu, 19 Nov 2020 16:41:48 +0100

Hi

I am using psycopg2 in a Django app. In my code I am checking for various
exceptions, one of which is foreign key violations.

I see in the psycopg2 docs https://www.psycopg.org/docs/errors.html that
ForeignKeyViolation
is under the base IntegrityError exception. I would like to be able to
specifically catch, and respond to the ForeignKeyViolation error. I am
coding using the recommendation in the docs (below).

It is working (a forced FK violation is specifically caught) my question is
though that in my IDE (PyCharm) it reports that it cannot find the
reference 'errors' and I cannot use dotted links to drill down to the
errors.ForeignKeyViolation function.

I can type psycopg2.IntegrityError and reference to it is found (and I see
that it is listed in the __init.py__ file).

When I Google this some say it is a PyCharm bug, some say that PyCharm is
following the Python package convention.

Can anyone advise.

Thanks in advance.

Patrick

try:
    cursor_wsr.close()
    conn.commit()
    conn.close()
except psycopg2.errors.ForeignKeyViolation as err:

Cannot find reference 'errors' in '__init__.py | __init__.py'
Inspection info: This inspection detects names that should resolve but
don't. Due to dynamic dispatch and duck typing, this is possible in a
limited but useful number of cases. Top-level and class-level items
are supported better than instance items.

---

From: Daniele Varrazzo <[email-masked]>
Date: Thu, 19 Nov 2020 16:37:51 +0000

On Thu, 19 Nov 2020 at 15:42, Patrick Starrenburg
<[email-masked]> wrote:

> I am using psycopg2 in a Django app. In my code I am checking for various exceptions, one of which is foreign key violations.
>
> I see in the psycopg2 docs https://www.psycopg.org/docs/errors.html that ForeignKeyViolation
> is under the base IntegrityError exception. I would like to be able to specifically catch, and respond to the ForeignKeyViolation error. I am coding using the recommendation in the docs (below).
>
> It is working (a forced FK violation is specifically caught) my question is though that in my IDE (PyCharm) it reports that it cannot find the reference 'errors' and I cannot use dotted links to drill down to the errors.ForeignKeyViolation function.
>
> I can type psycopg2.IntegrityError and reference to it is found (and I see that it is listed in the __init.py__ file).
>
> When I Google this some say it is a PyCharm bug, some say that PyCharm is following the Python package convention.

Yes, it is a PyCharm shortcoming: the exception is there:

    >>> import psycopg2.errors
    >>> psycopg2.errors.ForeignKeyViolation
    psycopg2.errors.ForeignKeyViolation

The exceptions are defined in the C module, but they are exposed in
the errors module. If you look at the source code for the module, it
appears mostly empty: the exceptions are added there when the
psycopg2._psycopg internal module is imported.

Personally this is good enough: the module works as expected for all
Python code; supporting PyCharm is not mandatory as far as I'm
concerned. I am happy to receive patches to make PyCharm work better,
but working on it myself isn't my priority now.

-- Daniele