如何在Ecto多Repo配置中忽略指定Repo执行迁移?
解决Ecto迁移时忽略指定Repo的问题
当然可以!针对你这种一个Repo由Ecto管理迁移、另一个由Rails维护的场景,Ecto提供了两种简单的方式来指定只执行目标Repo的迁移:
1. 执行命令时指定Repo(临时方案)
每次运行迁移命令时,通过--repo参数明确指定要处理的Repo即可:
mix ecto.migrate --repo MyApp.Repo
这样Ecto就只会处理MyApp.Repo的迁移任务,完全跳过MyApp.LegacyRepo,从根源上避免报错。如果之后偶尔需要对LegacyRepo执行操作(比如查看迁移状态),也可以用同样的方式指定它:
mix ecto.migrations --repo MyApp.LegacyRepo
2. 配置默认Repo(永久方案)
如果不想每次都手动加参数,可以在项目的mix.exs文件中,给project函数设置默认的:ecto_repos配置:
def project do [ app: :my_app, version: "0.1.0", # 其他原有配置... ecto_repos: [MyApp.Repo] ] end
这样默认执行mix ecto.migrate时,Ecto会自动使用这个配置里的Repo,而你在config.exs中全局配置的ecto_repos: [MyApp.Repo, MyApp.LegacyRepo]依然有效,不会影响其他需要用到MyApp.LegacyRepo的业务代码。
为什么原来会报错?
默认情况下,Ecto会遍历所有配置在全局:ecto_repos中的Repo,尝试执行迁移操作。但MyApp.LegacyRepo的迁移由Rails维护,Ecto找不到对应的迁移文件或者迁移表的结构不符合预期,所以触发了错误。通过指定特定Repo,就能绕开这个冲突。
内容的提问来源于stack exchange,提问作者Josh Crews
相关产品推荐
相关产品推荐

