【发布时间】:2021-09-03 10:48:23
【问题描述】:
我正在尝试从 django 上的 postgresql 检索 datetime 键入的数据。
但是如果微秒有前导0,如下所示
| datetime_field |
|2021-06-07 09:22:13.099866+00 |
结果显示为
datetime.datetime(2021, 6, 7, 9, 22, 13, 998660, tzinfo=<UTC>)
在 Python 中。
注意微秒099866。它已更改为998660。
如果我插入生成的 datetime 对象而不对 postgresql 进行任何更改,则上传如下。
| datetime_field |
| 2021-06-07 09:22:13.99866+00 |
头部的0消失了。
似乎这个问题来自 psycopg2,而不仅仅是 django,但我找不到任何解决方案。
我怎样才能获得完整的微秒?
附言欢迎只编辑英文。由于我不会说英语,所以我不确定我是否写出了正确的表达方式。
添加确切的步骤。
我正在做 docker 容器的工作。现在使用了两个容器,分别用于 django 服务器和 PostgreSQL 服务器。
Version infos:
Python 3.9.1
Django==3.1.4
psycopg2==2.8.6
postgres (PostgreSQL) 13.1 (Debian 13.1-1.pgdg100+1)
我正在使用生产数据库的克隆进行测试。
- SELECT 查询有问题的数据。
TEST=# SELECT issued_at FROM table_name WHERE id = 153;
issued_at
-------------------------------
2021-06-18 10:10:49.075392+00
(1 row)
- 在
python manage.py shell中,使用connections.cursor()检索数据
>>> with transaction.atomic():
... query = f'''SELECT issued_at FROM table_name WHERE id = 153;'''
... with connections['test_db'].cursor() as cursor:
... cursor.execute(query)
... print(cursor.fetchone())
...
(datetime.datetime(2021, 6, 18, 10, 10, 49, 753920, tzinfo=<UTC>),)
加法 2.
当我使用 django 的Model.objects.get() 获取数据时,结果很好。
>>> data = TableName.objects.get(id=153)
>>> data.issued_at
datetime.datetime(2021, 6, 18, 10, 10, 49, 75392, tzinfo=<UTC>)
好像是django.db.connections的一种问题。
【问题讨论】:
-
这看起来像是一个潜在的错误。您或许可以为此创建一张票:code.djangoproject.com/newticket
-
这些值作为数字发送到数据库,而不是作为字符串。您可以将它们存储在字符串中,然后插入它们。
-
@NikhilB:是的,但关键是读取和写入应该是相反的:如果您将一些时间戳写入数据库,您希望读取相同的值。情况并非如此,这很奇怪。
-
@WillemVanOnsem 谢谢。如果结果是一个错误,我会创建一个。我现在正在对其进行更多测试。
-
这是一个愚蠢的问题。我在检索数据时犯了一个错误。对不起,感谢您的帮助。
标签: python django postgresql datetime psycopg2