gpt4 book ai didi

postgresql - 如何在 Ecto 模式中设置 `DateTime` 和在迁移中设置 `timestamp with time zone` (`timestamptz` ) PostgreSQL 类型?

转载 作者:行者123 更新时间:2023-11-29 11:56:04 33 4
gpt4 key购买 nike

想在 Ecto 模式和迁移中使用 DateTime,而不是默认的 NaiveDateTime,也在 PostgreSQL 中使用 timestamptz,而不是默认 timestamp(又名。timestamp without time zone)。

最佳答案

ECTO 迁移:切换到 timestamptz:utc_datetime

注意:Ecto.Migration.timestamps/1 ( source ) 全局配置总是可以在本地覆盖。

1。全局配置

使用 Ecto.Migration docs 中的 :migration_timestamps 配置选项:

# in ./config/dev.exs (for example)

config :app, App.Repo, migration_timestamps: [type: :timestamptz]

并且可以像往常一样在迁移中使用 Ecto.Migration.timestamps/1:

# ./priv/repo/migrations/20190718195828_create_users.exs

create table(:users) do
add :username, :string, null: false

timestamps()
end

Postgres 适配器会自动切换从 Elixir 到 DateTime 的表示NaiveDateTime

2。本地配置

使用Ecto.Migration.timestamps/1:type 选项:

defmodule App.Repo.Migrations.CreateUsers do

use Ecto.Migration

def change do
create table(:users) do
add :username, :string, null: false

timestamps(type: :timestamptz)
end
end
end

ECTO SCHEMAS:切换到:utc_datetime

1。全局配置

Ecto 模式也需要修改为使用 :utc_datetime,否则他们会期望NaiveDateTime 默认情况下。稍微修改一下中的示例 Ecto.Schema docs :

# Define a module to be used as base
defmodule MyApp.Schema do
defmacro __using__(_) do
quote do
use Ecto.Schema

# In case one uses UUIDs
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id

# ------------------------------------
@timestamps_opts [type: :utc_datetime]

end
end
end

# Now use MyApp.Schema to define new schemas
defmodule MyApp.Comment do
use MyApp.Schema

schema "comments" do
belongs_to :post, MyApp.Post

timestamps()
end
end

2。本地配置

defmodule ANV.Accounts.User do

use Ecto.Schema

# -- EITHER --------------------------
@timestamps_opts [type: :utc_datetime]

schema "users" do

field :username, :string

# -- OR -----------------------
timestamps(type: :utc_datetime)
end

资源


  • lau/tzdata

    DateTime在 Elixir 中“仅处理“Etc/UTC”datetimes”,但可以使用自定义配置时区数据库,也就是tzdata图书馆是


+----------------------+------------------+------------------------+------------------------------+-----------------------------------+
| Ecto 3 type | Elixir type | Supports microseconds? | Supports DateTime functions? | Supports NaiveDateTime functions? |
+----------------------+------------------+------------------------+------------------------------+-----------------------------------+
| :utc_datetime_usec | DateTime | YES | YES | YES |
| :utc_datetime | DateTime | NO | YES | YES |
| :naive_datetime_usec | NaiveDateTime | YES | NO | YES |
| :naive_datetime | NaiveDateTime | NO | NO | YES |
+----------------------+------------------+------------------------+------------------------------+-----------------------------------+


关于postgresql - 如何在 Ecto 模式中设置 `DateTime` 和在迁移中设置 `timestamp with time zone` (`timestamptz` ) PostgreSQL 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58206597/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com