MagicStack / MagicStack/asyncpg

Cannot use datetimes before UNIX epoch on Windows

Ouverte
#1,115 0 commentaires 0 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: 15.5
  • Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
    the issue with a local PostgreSQL install?
    : Local PostgreSQL install
  • Python version: 3.10.1
  • Platform: Windows
  • 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?
    : N/A

If I have this query:

INSERT INTO process.start_and_end (user_id, process_id, start_dt, end_dt) VALUES  ($1, $2, $3, $4);

and in Python I do:

await conn.executemany(query, [(1325, 1001, datetime.datetime(1969, 12, 31, 0, 0), None)])

this line throws the following exception:

Traceback (most recent call last):
  File "asyncpg\protocol\prepared_stmt.pyx", line 175, in asyncpg.protocol.protocol.PreparedStatementState._encode_bind_msg
  File "asyncpg\protocol\codecs/base.pyx", line 227, in asyncpg.protocol.protocol.Codec.encode
  File "asyncpg\protocol\codecs/base.pyx", line 129, in asyncpg.protocol.protocol.Codec.encode_scalar
  File "asyncpg\pgproto\./codecs/datetime.pyx", line 222, in asyncpg.pgproto.pgproto.timestamptz_encode
OSError: [Errno 22] Invalid argument

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "main.py", line 919, in <module>
    loop.run_until_complete(async_main())
  File "C:\Scoop\apps\python\current\lib\asyncio\base_events.py", line 641, in run_until_complete
    return future.result()
  [...]
  File "main.py", line 401, in __insert_tape
    await conn.executemany(query, [(1325, 1001, datetime.datetime(1969, 12, 31, 0, 0), None)])
  File ".venv\lib\site-packages\asyncpg\connection.py", line 391, in executemany
    return await self._executemany(command, args, timeout)
  File ".venv\lib\site-packages\asyncpg\connection.py", line 1911, in _executemany
    result, _ = await self._do_execute(query, executor, timeout)
  File ".venv\lib\site-packages\asyncpg\connection.py", line 1945, in _do_execute
    result = await executor(stmt, None)
  File "asyncpg\protocol\protocol.pyx", line 267, in bind_execute_many
  File "asyncpg\protocol\coreproto.pyx", line 974, in asyncpg.protocol.protocol.CoreProtocol._bind_execute_many_more
  File "asyncpg\protocol\protocol.pyx", line 230, in genexpr
  File "asyncpg\protocol\prepared_stmt.pyx", line 204, in asyncpg.protocol.protocol.PreparedStatementState._encode_bind_msg
asyncpg.exceptions.DataError: invalid input for query argument $3 in element #0 of executemany() sequence: datetime.datetime(1969, 12, 31, 0, 0) ([Errno 22] Invalid argument)

Digging into it a bit more, I found that the culprit is this line in the codec for datetime objects, which is related to this old CPython issue on Windows: https://github.com/python/cpython/issues/80940.

The fix looks quite simple, but unfortunately I do not have the time to work on that, so I'm opening an issue instead of a PR.

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

Commencez par la ligne liée dans py-pgproto's codecs/datetime.pyx et comparez son comportement avec le issue CPython Windows référencé. Reproduisez le bind de datetime.datetime(1969, 12, 31) via executemany() sous Windows. C'est terminé lorsque les datetimes antérieurs à l'époque UNIX ne lèvent plus OSError lors de l'encodage.

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é
Plutôt claire
Accessibilité débutants
42/100

Recevez les nouvelles issues par e-mail

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