Elixir执行mix ecto.create连接MySQL时报postgrex匹配错误
报错根因
从报错栈可以看到,当前执行mix ecto.create时调用的是Ecto.Adapters.Postgres(PostgreSQL适配器),该适配器运行时依赖:postgrex包,但你已经把依赖从:postgrex换成了MySQL对应的:myxql,自然会触发postgrex.app文件不存在的错误。
问题本质是仅替换了依赖,没有把Ecto的数据库适配器从Postgres切换为MySQL,配置修改不完整。
解决步骤
- 确认依赖配置并拉取正确包
打开根目录下的mix.exs,找到deps/0函数,确认已移除:postgrex依赖,正确配置MySQL相关依赖:
保存后依次执行以下命令:defp deps do [ {:ecto_sql, "~> 3.8"}, {:myxql, ">= 0.0.0"} # 其余项目原有依赖保持不变 ] endmix deps.clean postgrex # 清理残留的postgrex文件 mix deps.get # 拉取myxql等正确依赖 - 修改Repo模块的适配器配置
找到项目的Ecto仓库文件,默认路径为lib/[你的项目名]/repo.ex,将use Ecto.Repo配置里的adapter字段从Postgres适配器改为MySQL对应的MyXQL适配器:defmodule YourApp.Repo do use Ecto.Repo, otp_app: :your_app, adapter: Ecto.Adapters.MyXQL # 原值为Ecto.Adapters.Postgres,必须替换 end - 修正各环境的数据库连接配置
检查config/目录下的所有配置文件(包括config.exs、dev.exs、test.exs、prod.exs等),找到Repo对应的配置段,将参数调整为MySQL适配的内容,注意MySQL默认端口为3306,不要保留Postgres默认的5432端口配置,参考示例:config :your_app, YourApp.Repo, username: "root", # 替换为你的MySQL账号 password: "your_mysql_password", # 替换为你的MySQL密码 hostname: "localhost", port: 3306, database: "your_app_db" # 替换为你要创建的数据库名 - 清除编译缓存后重试
执行以下命令清除旧的编译缓存,避免缓存的旧Postgres适配器逻辑被调用:
缓存清理完成后重新执行mix cleanmix ecto.create即可正常连接MySQL创建数据库。
注意:如果项目配置了多个Ecto Repo,需要逐个检查所有Repo的适配器配置,避免遗漏。
内容的提问来源于stack exchange,提问作者Nikhil Jindal
相关产品推荐
相关产品推荐

