gpt4 book ai didi

elixir - Ecto - 无法删除自定义命名的唯一索引

转载 作者:行者123 更新时间:2023-12-04 01:02:10 31 4
gpt4 key购买 nike

我无法成功运行 Ecto 迁移以删除最初创建时提供的唯一索引 :name属性(以便不使用默认索引名称)。但是,我现在无法删除该索引,因为似乎 Ecto 正在尝试查找名称不正确的索引(尽管我已经提供了它)。
唯一索引最初是通过迁移创建的,如下所示:

def change do
create(
unique_index("foo", [:bar_id],
where: "rejected IS NULL AND accepted IS NULL)",
name: :bar_pending_index
)
)
end
当我在 psql shell 中检查表时,我看到这个索引被列为:
"bar_pending_index" UNIQUE, btree (bar_id) WHERE rejected IS NULL AND accepted IS NULL
为了删除索引,我编写了以下迁移:
def up do
drop index("foo", [:bar_pending_index])
end

def down do
create(
unique_index("foo", [:bar_id],
where: "rejected IS NULL AND accepted IS NULL)",
name: :bar_pending_index
)
)
end
但是,当我尝试运行此迁移时,出现错误
14:01:56.573 [info]  == Running 20210610173741 MyApp.Repo.Migrations.DropIndex.up/0 forward

14:01:56.576 [info] drop index foo_bar_pending_index_index
** (Postgrex.Error) ERROR 42704 (undefined_object) index "foo_bar_pending_index" does not exist
在我看来,它似乎试图应用 Ecto 通常认为的“默认”命名约定,也就是说,它希望在索引名称前面加上表名,并在索引名称后面加上“索引”一词。通过 Ecto 迁移删除自定义命名索引的合适方法是什么?谢谢!

最佳答案

当您这样做时drop index("foo", [:bar_pending_index])您正在调用相同的 index/3 用于创建索引的函数,类似于 unique_index/3 .
查看这两个函数的文档,您会注意到第二个参数始终是用于索引的列(drop 上的示例:drop index("posts", [:name]) 由于列名 :name 有点含糊不清) .
因此,您应该做的实际上与您创建索引的方式非常相似,例如:

drop index("foo", [:bar_id], name: :bar_pending_index)

关于elixir - Ecto - 无法删除自定义命名的唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67926561/

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