negative interval encoding issues due to python's timedelta implementation details
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 32/100
Piste de recherche
Aucun fichier source ni test n’est indiqué. Commencez par reproduire le cas d’un timedelta négatif de trois heures avec asyncpg 0.29.0, Python 3.11.7 et PostgreSQL 16.1, puis suivez le comportement de l’encodage et du décodage de l’intervalle. Le travail est terminé lorsque la représentation attendue ou une solution de contournement documentée est établie, avec une couverture de régression pour les intervalles négatifs de moins d’un jour.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
- asyncpg version: 0.29.0
- PostgreSQL version: 16.1
- Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
the issue with a local PostgreSQL install?: this is happening on local PG - Python version: 3.11.7
- Platform:
- Do you use pgbouncer?: no
- Did you install asyncpg with pip?: yes
- If you built asyncpg locally, which version of Cython did you use?:
- Can the issue be reproduced under both asyncio and
uvloop?: yes
Python's timedelta implementation only allows to store negative number of days, hours, minutes, seconds, microseconds are always positive values. So when a negative value smaller than a day is interpreted it is stored in a strange way, example from Python's documentation:
Note that normalization of negative values may be surprising at first. For example:
>>> from datetime import timedelta
>>> d = timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)
https://docs.python.org/3/library/datetime.html?highlight=timedelta#datetime.timedelta
In my particular case when I'm trying to store -3 hours, that's getting translated in python to:
datetime.timedelta(days=-1, seconds=75600)
And ends up stored in postgresql as: "0 years 0 mons -1 days 21 hours 0 mins 0.0 secs"
Is there also a workaround where I can skip timedelta for interval?
- Langage dominant
- Python
- Étoiles
- 8.1k
- Forks
- 469
- Merge moyen
- 3 j 21 h
- PR mergées (30 j)
- 15
Préparer son environnement
Nous n'avons pas encore vérifié les fichiers d'installation de ce projet. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de MagicStack/asyncpg
-
Difficulté 3/5 1-2 jours Accessibilité débutants 72/100
MagicStack/asyncpg#1342 ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 56/100
MagicStack/asyncpg#1340 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 28/100
MagicStack/asyncpg#1337 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 42/100
MagicStack/asyncpg#1330 · 1 commentaire ·
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 38/100
MagicStack/asyncpg#1322 ·
Toutes les issues de MagicStack/asyncpg
Issues similaires
-
needs triage
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
openvinotoolkit/openvino_notebooks#3665 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
Les mainteneurs répondent en général sous 1 jour
-
docs
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour
-
benchmark-gap
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour