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

使用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表中记录已执行的迁移版本,未正确修改或执行新迁移则不会更新表结构。

解决方案

方案一:新增迁移添加时间戳列(推荐生产环境使用)

  1. 生成新迁移文件:
    mix ecto.gen.migration add_timestamps_to_topics
    
  2. 打开生成的迁移文件,修改change函数:
    def change do
      alter table(:topics) do
        timestamps()
      end
    end
    
  3. 执行迁移:
    mix ecto.migrate
    

方案二:回滚并修改原迁移(仅适用于开发环境、无重要数据时)

  1. 回滚最近一次迁移:
    mix ecto.rollback -n 1
    
  2. 打开原迁移文件20220728225556_add_topics.exs,在create table块中添加timestamps():
    def change do
      create table(:topics) do
        add :title, :string
        timestamps() # 新增这行
      end
    end
    
  3. 重新执行迁移:
    mix ecto.migrate
    

验证操作

迁移完成后,通过数据库客户端查看topics表,确认inserted_at和updated_at列已存在,再测试表单提交的插入操作即可正常执行。

内容的提问来源于stack exchange,提问作者Terran Adams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:27:09