带有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)
我正在使用生产数据库的克隆进行测试。
- 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
的问题。
我没看到:
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
我正在尝试从 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)
我正在使用生产数据库的克隆进行测试。
- 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
的问题。
我没看到:
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