Elixir 的 Ecto 中 varchar(custom_size) 的 PostgreSQL 数组
A PostgreSQL array of varchar(custom_size) in Elixir's 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 table 中有一个 varchar(140)
的数组,而不是更多的 'spacy' 默认值(255?)。
add
接受任何原子作为列类型并将其按原样传递给适配器,PostgreSQL 适配器按原样将未知类型发送给数据库,这意味着我们可以指定确切的类型,即varchar(140)
作为{:array, _}
的第二个元素,只要是一个原子即可。
add :tags, {:array, :"varchar(140)"}
我已经对此进行了测试,运行 迁移正确地创建了所需类型的列。
my_app_dev=# \d posts
Table "public.posts"
Column | Type | Modifiers
----------+--------------------------+---------------------------------------------------
...
tags | character varying(140)[] |
schema
中无需更改任何内容。那里的类型应该保持 {:array, :string}
.
我有一个这样的 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 table 中有一个 varchar(140)
的数组,而不是更多的 'spacy' 默认值(255?)。
add
接受任何原子作为列类型并将其按原样传递给适配器,PostgreSQL 适配器按原样将未知类型发送给数据库,这意味着我们可以指定确切的类型,即varchar(140)
作为{:array, _}
的第二个元素,只要是一个原子即可。
add :tags, {:array, :"varchar(140)"}
我已经对此进行了测试,运行 迁移正确地创建了所需类型的列。
my_app_dev=# \d posts
Table "public.posts"
Column | Type | Modifiers
----------+--------------------------+---------------------------------------------------
...
tags | character varying(140)[] |
schema
中无需更改任何内容。那里的类型应该保持 {:array, :string}
.