MagicStack / MagicStack/asyncpg

invalid input for query argument (can't subtract offset-naive and offset-aware datetimes)

Ouverte
#1,139 0 commentaires 6 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Python
Étoiles
8.1k
Forks
468
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

* **asyncpg version**: 0.29.0
* **PostgreSQL version**: 13.8
* **Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
the issue with a local PostgreSQL install?**: local postgres 13.8-alpine running in docker
* **Python version**: 3.12.1
* **Platform**: macos
* **Do you use pgbouncer?**: no
* **Did you install asyncpg with pip?**: yes
* **If you built asyncpg locally, which version of Cython did you use?**: N/A
* **Can the issue be reproduced under both asyncio and
[uvloop](https://github.com/magicstack/uvloop)?**: N/A

I'm getting an error:
```shell
File "asyncpg/protocol/prepared_stmt.pyx", line 204, in asyncpg.protocol.protocol.PreparedStatementState._encode_bind_msg
asyncpg.exceptions.DataError: invalid input for query argument $1: datetime.datetime(2024, 3, 21, 21, 17, 9... (can't subtract offset-naive and offset-aware datetimes)
```
When passing python's datetime object with timezone details to be stored in a column without timezone. Minimal steps to reproduce:

```python

import asyncio
import datetime

import asyncpg

DSN = 'postgresql://user:password@host:port/database'

CREATE_SQL = """
DROP TABLE IF EXISTS timestamps_test;
CREATE TABLE timestamps_test
(
ts_no_tz timestamp without time zone,
ts_tz timestamp with time zone
);
"""
INSERT_SQL = "INSERT INTO timestamps_test (ts_no_tz, ts_tz) VALUES ($1, $2);"

async def main():
conn = await asyncpg.connect(DSN)
try:
await conn.execute(CREATE_SQL)
now = datetime.datetime.fromisoformat("2024-03-21 21:17:09.631169+07:00")
await conn.execute(INSERT_SQL, now, now)
finally:
await conn.close()

if __name__ == '__main__':
asyncio.run(main())

```

I understand that timezone details would be lost either way, but it's inconsistent with PostgreSQL's native behaviour, when trying to insert the same date with `psql`:

```psql

$ psql
psql (15.6, server 13.8)
Type "help" for help.

INSERT INTO
timestamps_test (ts_no_tz, ts_tz)
VALUES
(TIMESTAMP '2024-03-21 21:17:09.631169+07:00',
TIMESTAMP WITH TIME ZONE '2024-03-21 21:17:09.631169+07:00');
INSERT 0 1

# SELECT * FROM timestamps_test;
ts_no_tz | ts_tz
----------------------------+-------------------------------
2024-03-21 21:17:09.631169 | 2024-03-21 14:17:09.631169+00
(1 row)
```
timezone info is ignored and lost but there's no error.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Examinez asyncpg/protocol/prepared_stmt.pyx à la ligne 204 ainsi que le chemin d’encodage de l’argument timestamp ; commencez par exécuter la reproduction Python/PostgreSQL fournie. Le travail est considéré comme terminé lorsqu’un aware datetime peut être transmis à un timestamp without time zone sans déclencher l’offset-mismatch error, tandis que le cas timestamp with time zone conserve son comportement existant.

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

Évaluation

Stack technique
postgresql, python
Domaine
databases
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

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