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

时间:2017-10-13 15:45:51

标签: postgresql elixir phoenix-framework ecto

我有一个像这样的Ecto架构:

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

  timestamps()
end

在相应的迁移中有:

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

  timestamps()
end

我希望tags中的每个标记的最大大小为140.如何在迁移中指定此约束?我的目标是在生成的PostgreSQL表中有一个varchar(140)数组,而不是更多'spacy'默认值(255?)。

1 个答案:

答案 0 :(得分:3)

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

{:array, _}

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

add :tags, {:array, :"varchar(140)"}

无需更改my_app_dev=# \d posts Table "public.posts" Column | Type | Modifiers ----------+--------------------------+--------------------------------------------------- ... tags | character varying(140)[] | 中的任何内容。那里的类​​型应该保留schema