使用Repo.insert(changeset)向Postgres的topics表插入行时出错
解决Ecto插入时"inserted_at"列不存在的问题
问题根源
你的topic.ex Schema中使用了timestamps()宏,这个宏会自动为Changeset注入inserted_at和updated_at字段,但对应的迁移文件20220728225556_add_topics.exs仅创建了title列,未生成这两个时间戳列,导致数据库表结构与Schema不匹配,插入数据时触发列不存在的错误。重新生成迁移无效是因为Ecto会在schema_migrations表中记录已执行的迁移版本,未正确修改或执行新迁移则不会更新表结构。
解决方案
方案一:新增迁移添加时间戳列(推荐生产环境使用)
- 生成新迁移文件:
mix ecto.gen.migration add_timestamps_to_topics - 打开生成的迁移文件,修改
change函数:def change do alter table(:topics) do timestamps() end end - 执行迁移:
mix ecto.migrate
方案二:回滚并修改原迁移(仅适用于开发环境、无重要数据时)
- 回滚最近一次迁移:
mix ecto.rollback -n 1 - 打开原迁移文件
20220728225556_add_topics.exs,在create table块中添加timestamps():def change do create table(:topics) do add :title, :string timestamps() # 新增这行 end end - 重新执行迁移:
mix ecto.migrate
验证操作
迁移完成后,通过数据库客户端查看topics表,确认inserted_at和updated_at列已存在,再测试表单提交的插入操作即可正常执行。
内容的提问来源于stack exchange,提问作者Terran Adams
相关产品推荐
相关产品推荐

