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

将CSV导入PostgreSQL时出现Bigint错误及额外id列疑问

解决PostgreSQL COPY导入报错及Ecto自动生成id列的问题

一、修复CSV导入的bigint格式错误

你的COPY命令犯了一个基础错误:命令里指定的分隔符是|,但实际CSV内容是用逗号分隔的。PostgreSQL会把整行内容当成一个字段去匹配id列(bigint类型),自然会抛出格式错误。

修正后的命令如下:

psql -d db_name --user=username -c "\copy test_list FROM 'testmngrs.csv' delimiter ',' csv;"

如果你的CSV第一行是表头(比如id,name,email,phone,city),需要加上header参数跳过表头行,避免把表头内容当成数据导入:

psql -d db_name --user=username -c "\copy test_list FROM 'testmngrs.csv' delimiter ',' csv header;"

二、解惑Ecto自动生成的额外id列

Ecto作为Elixir的数据库工具,默认会为每个通过它创建的表自动添加id列,作为bigint类型的自增主键——哪怕你在迁移文件里没显式定义这一列。这是Ecto的默认行为,目的是简化绝大多数场景下的主键管理。

如果确实不需要这个默认主键,你需要做两步修改:

  1. 在对应的Ecto Schema中添加@primary_key false注解,关闭自动主键生成:
    defmodule YourApp.TestList do
      use Ecto.Schema
      @primary_key false
      schema "test_list" do
        # 在这里定义你的业务字段,比如:name, :email等
      end
    end
    
  2. 在迁移文件中不要创建id列,如果需要自定义主键,要显式写出主键的定义语句。

内容的提问来源于stack exchange,提问作者Chris Rad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:20:47