Elixir 的 Ecto 中的 PostgreSQL varchar(custom_size) 数组

Ale*_*Nil 3 postgresql elixir ecto phoenix-framework

我有一个像这样的 Ecto 模式:

schema "quotes" do
  field :quote, :string
  field :tags, {:array, :string}

  timestamps()
end
Run Code Online (Sandbox Code Playgroud)

在相应的迁移中有:

create table(:quotes) do
  add :quote, :string, size: 145
  add :tags, {:array, :string}

  timestamps()
end
Run Code Online (Sandbox Code Playgroud)

我希望每个标签的tags最大大小为 140。如何在迁移中指定此约束?我的目标是在生成的 PostgreSQL 表中包含一个数组,varchar(140)而不是更“宽敞”的默认值(255?)。

Dog*_*ert 7

add接受任何原子作为列类型并将其按原样传递给适配器,并且 PostgreSQL 适配器按原样将未知类型发送到数据库,这意味着我们可以指定确切的类型,即作为 的varchar(140)第二个元素{:array, _},它只需要是一个原子。

add :tags, {:array, :"varchar(140)"}
Run Code Online (Sandbox Code Playgroud)

我已经对此进行了测试,并且正确运行迁移会创建所需类型的列。

my_app_dev=# \d posts
                                  Table "public.posts"
  Column  |           Type           |                     Modifiers
----------+--------------------------+---------------------------------------------------
 ...
 tags     | character varying(140)[] |
Run Code Online (Sandbox Code Playgroud)

无需更改 中的任何内容schema。那里的类​​型应该保留{:array, :string}。