aws / aws/amazon-redshift-python-driver

support `Cursor` attribute to provide ANSI SQL State Code

Ouverte
#220 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Python
Étoiles
220
Forks
86
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

While a `Cursor` attribute providing SQL State Code is not officially a part of [PEP 249: Python DB API 2.0 spec](https://peps.python.org/pep-0249/), there is an ANSI-standardized "SQL state code".

Many database drivers provide this as a `Cursor` attribute, dbt was able to depend on these drivers to provide it for `ConnectionManager.get_response()` method, which will report to users after successful queries the kind of operation performed (`SELECT`, `INSERT`, `CREATE`) and the numbers of rows affected. Originally the Redshift adapter for dbt, was supported by the `psycopg2` driver, which provides this information in `statusmessage`.

As reported in https://github.com/dbt-labs/dbt-redshift/issues/785, after migrating the driver dependency to `redshift-connector`, users are in a degraded state and receive less information than previously due to the SQL state not being available.

### Support for SQL state amongst popular analytics database drivers

| Driver | `Cursor` attribute (docs) |
|--------|--------|
| psycopg2 | [`statusmessage`](https://www.psycopg.org/docs/cursor.html#cursor.statusmessage) |
| `snowflake-connector-python` | [`sqlstate`](https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-api#id7) |

### Ideal implementation

[Postgres's `CommandComplete` message](https://www.postgresql.org/docs/current/protocol-message-formats.html#PROTOCOL-MESSAGE-FORMATS-COMMANDCOMPLETE)

| Command | Tag | `rows` indicates the number of rows |
|------------------------|---------------------|-----------------------------------------------------------------------------|
| `INSERT` | `INSERT 0 rows` | inserted |
| `DELETE` | `DELETE rows` | deleted |
| `UPDATE` | `UPDATE rows` | updated |
| `MERGE` | `MERGE rows` | inserted, updated, or deleted |
| `SELECT` / `CREATE TABLE AS` | `SELECT rows` | retrieved |
| `MOVE` | `MOVE rows` | ursor's position has been changed by |
| `FETCH` | `FETCH rows` | that have been retrieved from the cursor |
| `COPY` | `COPY rows` | copied, only in `PostgreSQL` 8.2 and later |

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

The issue names ConnectionManager.get_response() in dbt and PostgreSQL's CommandComplete message, but no repository files or tests. Start by locating the cursor implementation and its handling of completed command metadata, then compare the available driver behavior with the listed statusmessage and sqlstate attributes. Done means the cursor exposes SQL state information and the affected-operation details are preserved for supported commands.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python, sql
Domaine
databases
Type d'issue
Fonctionnalité
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.