请帮助我解决此错误:
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”而不出错
3条答案
按热度按时间wpx232ag1#
是的,将
date
修改为time
(带或不带时区)时出现问题。问题在于Postgres中的日期没有时间组件,因此任何成功获取时间的尝试都会导致“00:00:00”。请尝试假设您的目标是更改类型,那么只需删除并重新添加列;
当然,我从来没有弄清楚没有日期的好时间是什么。哪个先出现,“10:15:00”还是“11:15:00”?如果10:15是今天,11:15是昨天,那么11:15先出现。除非你把它定义为午夜后的几个小时。所以,也许有一个更好的选择:
是的,时间戳占用更多空间,但更灵活。
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中读到的
a64a0gku3#
在我的例子中,a所做的是,删除de migrations,从所有工作正常的地方开始,然后我删除字段,应用migrations,然后像一个新列一样添加。它工作了。这样做django不知道,他认为我创建了一个新列,而不是改变一个列。😁