我正在向方案添加一个utc时区识别列。但是,在我的数据库中,该列的类型为timestamp(0),没有区域。
我做错了什么?我的计划如下:
defmodule Transaction do
use Ecto.Schema
import Ecto.Changeset
schema "transaction" do
field :platform_transaction_at, :utc_datetime
end
end
我的迁移文件看起来像
defmodule Transaction.Migrations.AddPlatformTransactionDatetime do
use Ecto.Migration
def change do
alter table(:transaction) do
add :platform_transaction_at, :utc_datetime
end
end
end
PostgreSQL没有用于存储带时区的时间戳的数据类型。有关更多讨论,请参见this elixir forum thread。您可能会反对确实存在一个名为“带时区的时间戳”的类型,但是该线程中的答案进一步说明了:
存在一个带有时区的令人困惑的时间戳,但它所做的只是将您输入的时间戳转换为UTC,并在读取时将其转换回数据库连接的时区(因此在大多数情况下是无用的)。它甚至不存储偏移量/时区。因此,您需要自己进行某种操作。
Ecto迁移中的:utc_datetime
和:naive_datetime
都在Postgres中创建了相同的类型:timestamp without time zone
http://www.creativedeletion.com/2019/06/17/utc-timestamps-in-ecto.html