You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"}
        # 其余项目原有依赖保持不变
      ]
    end
    
    保存后依次执行以下命令:
    mix 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 clean
    
    缓存清理完成后重新执行mix ecto.create即可正常连接MySQL创建数据库。

注意:如果项目配置了多个Ecto Repo,需要逐个检查所有Repo的适配器配置,避免遗漏。

内容的提问来源于stack exchange,提问作者Nikhil Jindal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:24:29