postgresql Django错误:无法将类型日期转换为没有时区的时间

kyvafyod  于 2022-12-26  发布在  PostgreSQL
关注(0)|答案(3)|浏览(355)

请帮助我解决此错误:

File "/Users/ecommerce/proshopvenv/lib/python3.8/site-packages/django/db/backends/utils.py", 
line 84, in _execute

return self.cursor.execute(sql, params)

psycopg2.errors.CannotCoerce: cannot cast type date to time without time zone
LINE 1: ..." ALTER COLUMN "createdAt" TYPE time USING "createdAt"::time

The above exception was the direct cause of the following exception:
"a lot of code, and:"

django.db.utils.ProgrammingError: cannot cast type date to time without time zone
LINE 1: ..." ALTER COLUMN "createdAt" TYPE time USING "createdAt"::time

在模型中我有:

createdAt = models.DateTimeField(auto_now_add=True)

以及我如何理解docs https://docs.djangoproject.com/en/3.2/ref/models/fields/
“auto_now和auto_now_add选项将始终使用创建或更新时默认时区中的日期。”
但是zone没有创建,或者其他错误,我创建了新的数据库,所以我可以删除所有表
也许在django中有一个步骤,它是时区的首字母?
已阅读此主题postgreSQL alter column data type to timestamp without time zone和许多其他主题,但无法将其修复为“migrate”而不出错

wpx232ag

wpx232ag1#

是的,将date修改为time(带或不带时区)时出现问题。问题在于Postgres中的日期没有时间组件,因此任何成功获取时间的尝试都会导致“00:00:00”。请尝试

select current_date::timestamp::time;

假设您的目标是更改类型,那么只需删除并重新添加列;

alter table test_table drop createdat;
alter table test_table add  createdat time  default '00:00:00'::time;

当然,我从来没有弄清楚没有日期的好时间是什么。哪个先出现,“10:15:00”还是“11:15:00”?如果10:15是今天,11:15是昨天,那么11:15先出现。除非你把它定义为午夜后的几个小时。所以,也许有一个更好的选择:

alter table test_table 
      alter column createdat 
               set data type timestamp 
             using createdat::timestamp;

是的,时间戳占用更多空间,但更灵活。

6ie5vjzr

6ie5vjzr2#

首先我想说谢谢Belayer,但没有评级投票给他的答案
我需要将列的类型从“date”改为“timestamp with time zone”,因为我的Django模型配置希望它们像createdAt = models.DateTimeField(auto_now_add=True)这样
所以我运行alter table "base_product" alter column "createdAt" type timestamp with time zone;
但有奇怪的事情对我来说,所有的表有类型“日期”修改为“时间戳与时区”(这是好的,因为有很少的其他地方,我需要),但只有不在表“基地_产品”,我运行查询,也不想修改它自动了
然后我运行ALTER TABLE "base_product" ALTER COLUMN "createdAt" DROP DEFAULT, ALTER COLUMN "createdAt" TYPE timestamp with time zone USING timestamp with time zone 'epoch' + "createdAt", ALTER COLUMN "createdAt" SET DEFAULT now();
我从postgres文档https://www.postgresql.org/docs/9.1/sql-altertable.html中读到的

a64a0gku

a64a0gku3#

在我的例子中,a所做的是,删除de migrations,从所有工作正常的地方开始,然后我删除字段,应用migrations,然后像一个新列一样添加。它工作了。这样做django不知道,他认为我创建了一个新列,而不是改变一个列。😁

相关问题