【问题标题】:Postgres table from test.csv file question来自 test.csv 文件问题的 Postgres 表
【发布时间】:2019-09-17 01:26:31
【问题描述】:

我想将 csv 文件复制到表中。所有 csv 文件列都映射到表列。但是表中有一个自动增量列。

例如:

test.csv 文件有 3 列 A ,B,C。相对值为 "city","name","sex"

A-------B-------C
city----name----sex

testtable 也有 4 列 seq_no,A,B,C 。 seq_no 是自增列。

从 "test.csv" 分隔符 ',' csv 复制到 testtable 会报错:copy tablett, line1,cloumn seq_no: "city"。

其实我希望第一行是

seq_no---A-------B-------C
1        city    name    sex

我无法更改 csv 和 table 。 bcz 它们很常见。

我在 shell 中使用 postgres 复制命令将 csv 数据插入到表中。如何解决这个问题?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    尝试添加要复制的列:

    COPY testtable(a, b, c)
    FROM "test.csv"
    DELIMITER ',',
    FORMAT CSV
    

    现在应该使用列 seq_no 的默认值。

    编辑:由于列名在变化,而且我们只知道它们在表中的位置,我们可能会从目录中动态获取它们,稍后使用它们来构建COPY 命令:

    SELECT a.attname
    FROM pg_attribute a
    INNER JOIN pg_class c ON c.oid = a.attrelid
    INNER JOIN pg_namespace n ON n.oid = c.relnamespace
    WHERE c.relname = 'insertTableNameHere'
        AND n.nspname = 'insertSchemaNameHere' --probably public
        AND a.attnum > 1
    ORDER BY a.attnum
    

    这会按“从左到右”的顺序为您提供每个通常可见的列(如果您使用 SELECT *,您会看到这些列)。

    【讨论】:

    • 是的。这是个好主意。但在我的情况下存在的问题是大约有 100 个表名为 table_1 , table_2 ,table_3 ....table_100 。而且这些表的结构不一样。我必须写 100 次复制命令。所以我不想在复制命令中添加指定的列名。
    • 不同的结构使事情变得更复杂。选项 1(不是很好,但是..):更改列的顺序,以便您获得值的三列是第一列。选项 2:在每次插入之前对目录进行查询并检索列名。也可以将它们用于您的参数化 SQL 命令
    • 感谢您的快速回复。我对你的选项 2 不是很清楚。你能给我更多的细节吗?
    • 感谢您的大力支持。我会试试的
    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多