【问题标题】:Django with postgresql, the datetime microsecond's leading 0 is disappearedDjango与postgresql,日期时间微秒的前导0消失了
【发布时间】: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)

我正在使用生产数据库的克隆进行测试。

  1. SELECT 查询有问题的数据。
TEST=# SELECT issued_at FROM table_name WHERE id = 153;
           issued_at
-------------------------------
 2021-06-18 10:10:49.075392+00
(1 row)
  1. 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


【解决方案1】:

我没看到:

CREATE TABLE public.dt_test (
    id integer,
    ts_fld timestamp without time zone,
    tsz_fld timestamp with time zone
);
insert into dt_test values (1, '2021-06-07 09:22:13.099866+00', '2021-06-07 09:22:13.099866+00');
insert into dt_test values (2, '2021-06-07 09:22:13.99866+00', '2021-06-07 09:22:13.99866+00');
select * from dt_test ;
 id |           ts_fld           |            tsz_fld            
----+----------------------------+-------------------------------
  1 | 2021-06-07 09:22:13.099866 | 2021-06-07 02:22:13.099866-07
  2 | 2021-06-07 09:22:13.99866  | 2021-06-07 02:22:13.99866-07

import psycopg2 
cur.execute('select * from dt_test')
rs = cur.fetchall()
rs                                                                                                                                                                        
Out[23]: 
[(1,
  datetime.datetime(2021, 6, 7, 9, 22, 13, 99866),
  datetime.datetime(2021, 6, 7, 2, 22, 13, 99866, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-420, name=None))),
 (2,
  datetime.datetime(2021, 6, 7, 9, 22, 13, 998660),
  datetime.datetime(2021, 6, 7, 2, 22, 13, 998660, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-420, name=None)))]
cur.execute('insert into dt_test(id, ts_fld) values(%s, %s)', [3, datetime.datetime(2021, 6, 7, 9, 22, 13, 99866)])
con.commit()
 select * from dt_test ;
 id |           ts_fld           |            tsz_fld            
----+----------------------------+-------------------------------
  1 | 2021-06-07 09:22:13.099866 | 2021-06-07 02:22:13.099866-07
  2 | 2021-06-07 09:22:13.99866  | 2021-06-07 02:22:13.99866-07
  3 | 2021-06-07 09:22:13.099866 | NULL

你看到的是标准化到 1000000:

select 998660/1000000.0;
        ?column?        
------------------------
 0.99866000000000000000

select 99866/1000000.0;
        ?column?        
------------------------
 0.09986600000000000000

【讨论】:

  • 哇...对不起,这是我对它的误解。谢谢,我会再试一次。
  • 嗯,我的测试似乎有点不同。我可以得到你的版本信息吗?我正在测试 postgres v13.1。 postgres (PostgreSQL) 13.1 (Debian 13.1-1.pgdg100+1)Django==3.1.4psycopg2==2.8.6
  • 我试过psycopg2 2.8.5 and 2.91postgres 12.7 and 13.0。我得到相同的结果。在您的问题中添加您在测试中采取的确切步骤以及返回的结果。现在我会省略Django。同时添加您正在使用的Python 版本。
  • 它是Python 3.9.1。我已经修改了问题。 django.db.connections 对象似乎有问题。
  • 我发现很难相信底层驱动程序是相同的,而这就是进行类型转换的部分。你确定connections['test_db'] 真的指向你认为的东西吗?
猜你喜欢
  • 2016-12-14
  • 2022-06-13
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多