微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Ecto - 无法删除自定义命名的唯一索引

我无法成功运行 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",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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。