带有postgresql的Django,日期时间微秒的前导0消失了

Django with postgresql, the datetime microsecond's leading 0 is disappeared

我正在尝试从 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

如果我在不对 postgresql 进行任何更改的情况下插入结果日期时间对象,则上传如下。

|        datetime_field        |
| 2021-06-07 09:22:13.99866+00 |

开头的0消失了

看来这个问题是由 psycopg2 引起的,而不仅仅是 django,但我找不到任何解决方法。

我怎样才能得到整个微秒数?

p.s。欢迎编辑英文版。由于我不会说英语,所以我不确定我写的表达是否正确。


添加精确步骤。

我正在 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()
  2. 检索数据
>>> 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的问题。

我没看到:

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