Postgresql 如何强制postgres在转储/恢复数据时使用csv中的列顺序?

Postgresql 如何强制postgres在转储/恢复数据时使用csv中的列顺序?,postgresql,restore,postgresql-copy,Postgresql,Restore,Postgresql Copy,我转储我的表数据: COPY( SELECT * FROM tariff_details ) TO STDOUT WITH( FORMAT CSV, HEADER ) 数据: id,tariff_id,name,price,option,periodic,value,sorder 17,1,Setup fee,5.000000000000000000,,f,,0 恢复数据时: COPY tariff_details FROM STDIN WITH( FORMAT CSV, HEADER )

我转储我的表数据:

COPY( SELECT * FROM tariff_details ) TO STDOUT WITH( FORMAT CSV, HEADER )
数据:

id,tariff_id,name,price,option,periodic,value,sorder
17,1,Setup fee,5.000000000000000000,,f,,0
恢复数据时:

COPY tariff_details FROM STDIN WITH( FORMAT CSV, HEADER )
我得到一个错误:

ERROR:  null value in column "periodic" violates not-null constraint
DETAIL:  Failing row contains (17, 1, Setup fee, 5.000000000000000000, null, f, null, 0).
CONTEXT:  COPY tariff_details, line 2: "17,1,Setup fee,5.000000000000000000,,f,,0"
数据库中的表定义为下一个:

  Column   |         Type          |                          Modifiers                          
-----------+-----------------------+-------------------------------------------------------------
 id        | integer               | not null default nextval('tariff_details_id_seq'::regclass)
 tariff_id | integer               | not null
 name      | character varying(64) | not null
 price     | tmoney                | not null
 periodic  | boolean               | not null default false
 option    | character varying(16) | 
 value     | text                  | 
 sorder    | integer               | not null default 0
如您所见,字段
选项
周期
被翻转

:

标题

指定文件包含一个标题行,其中包含文件中每列的名称。在输出时,第一行包含表中的列名,在输入时,忽略第一行。仅当使用CSV格式时才允许使用此选项

如何告诉postgres使用CSV文件中的列顺序? 可能吗

UPD


作为解决方法,我使用:
line=$$(head-n1${APP_ROOT}/db/${TABLE}.dump.csv)


您只需在以下位置指定目标列名:

(我翻转了
选项
周期


旁白:
SELECT*FROM tbl
按确定性顺序返回列-如中所定义。因此,在转储和还原之间,您的数据库中发生了一些变化。

作为我使用的解决方法:
columns=$$(head-n1${APP\u ROOT}/DB/${TABLE}.dump.csv)


使用(CSV格式,标题)从标准数据网复制费率详细信息(列表、目录、您的、列、此处、顺序)
,同样的操作也可以通过
复制…到@wildplasser:不,这是makefile。作为参数,它获取表名。我们不应该要求用户提供列。您的问题中没有Makefile和用户。坏消息是:如果您使用
SELECT*
RE(UPD),则列中没有顺序。您可以尝试使用sed或tr将$$line中的
\t
替换为
。仔细想想:您已经有逗号了。正如您所看到的那样:
从STDIN复制${TABLE}($$line)
dbrestoretable: export PGPASSWORD =  ${DB_PASS}
dbrestoretable:
    line=$$(head -n 1 ${APP_ROOT}/db/${TABLE}.dump.csv)
    @cat ${APP_ROOT}/db/${TABLE}.dump.csv | \
        psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} ${DB_NAME} -c \
            "BEGIN;COPY ${TABLE}($$line) FROM STDIN WITH( FORMAT CSV, HEADER );COMMIT;"  ||:
COPY tariff_details(id,tariff_id,name,option,price,periodic,value,sorder)
FROM STDIN WITH (FORMAT CSV, HEADER);
dbrestoretable: export PGPASSWORD =  ${DB_PASS}
dbrestoretable:
    columns=$$(head -n 1 ${APP_ROOT}/db/${TABLE}.dump.csv)
    @cat ${APP_ROOT}/db/${TABLE}.dump.csv | \
        psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} ${DB_NAME} -c \
            "BEGIN;COPY ${TABLE}($$columns) FROM STDIN WITH( FORMAT CSV, HEADER );COMMIT;"  ||: