执行mix ecto.migrate后未创建users表,可能的原因有哪些?
mix ecto.migrate 没创建出 users 表? 嘿,我来帮你排查下这个问题。结合你的迁移文件和操作,我整理了几个最容易踩坑的原因,你可以逐一排查:
数据库连接配置不匹配
先检查你的环境配置文件(比如config/dev.exs)里的Api.Repo配置,确认它指向的数据库是你预期的那个。有可能你配置的数据库不存在,或者使用的数据库用户没有创建表的权限。你可以手动用数据库客户端连接到配置的数据库,验证一下权限和数据库状态。迁移已被标记为执行,但实际未完成
Ecto 会通过schema_migrations表记录所有执行过的迁移版本。你可以先运行mix ecto.migrations命令,看看20180724182549_create_user_table这个迁移的状态是up还是down。如果显示up但users表不存在,大概率是之前的迁移过程中出现了中断(比如数据库连接突然断开)。这种情况你可以尝试回滚这个迁移:mix ecto.rollback -n 1,然后重新运行mix ecto.migrate。运行命令的环境不正确
如果你没有指定环境,Mix 默认会使用dev环境,但有可能你的配置文件里不同环境指向了不同的数据库。比如你可能不小心在prod环境下执行了迁移,但你检查的是dev环境的数据库。可以明确指定环境再试一次:MIX_ENV=dev mix ecto.migrate(把dev换成你实际需要的环境)。迁移过程中有隐藏错误
有时候迁移命令看起来没报错,但实际上有细节问题。你可以加上--verbose参数运行迁移,查看详细输出:mix ecto.migrate --verbose,这样能看到每一步执行的 SQL 语句和可能的错误信息。另外也可以检查 Mix 的日志文件,看看有没有遗漏的报错。数据库服务本身的问题
比如数据库服务器没有启动,或者磁盘空间不足导致无法创建表,甚至是数据库的引擎不支持某些语法(不过你的迁移代码是标准的 Ecto 写法,这种概率比较低)。你可以手动尝试在数据库里执行创建表的 SQL,验证数据库本身是否能正常工作。
内容的提问来源于stack exchange,提问作者BeniaminoBaggins

