Ecto关联同一类对象:创建Game时提示team_a_id列不存在
问题解决:Postgrex提示team_a_id列不存在但实际存在
可能原因及解决步骤
1. 强制重新编译代码
Ecto会缓存Schema定义,若修改Schema或迁移后未重新编译,可能导致Ecto无法识别新增列。执行以下命令强制编译:
mix compile --force
之后重启应用服务器(如mix phx.server)。
2. 验证迁移执行状态
再次确认CreateGames迁移是否已正确执行:
mix ecto.migrations
若迁移状态为down,执行迁移命令:
mix ecto.migrate
3. 检查create_game函数实现
确认MyApp.Store.create_game/1是否正确使用了Game.changeset。如果函数内部手动构造Changeset时遗漏了team_a_id和team_b_id,会导致插入错误。正确的实现示例:
def create_game(attrs) do %Game{} |> Game.changeset(attrs) |> Repo.insert() end
4. 确认数据库连接配置
检查应用配置文件(如config/dev.exs),确保Repo连接的是你查询的tourney_dev数据库,避免连接到其他环境(如test库)。
5. 检查表结构细节
在psql中执行\d games查看完整表结构,确认team_a_id和team_b_id的列名、类型完全正确,无拼写或大小写问题(PostgreSQL对大小写敏感,若迁移中用引号包裹列名会导致大小写混合,但你的迁移未使用引号,此问题概率较低)。
内容的提问来源于stack exchange,提问作者ntonnelier
相关产品推荐
相关产品推荐

