当前版本Hologres支持使用COPY命令导入客户端数据,您可以根据业务需求将标准输入的数据导入到指定的Hologres表中。

命令介绍

COPY:从客户端标准输入导入数据到指定表中。

COPY FROM:将数据从标准输入导入到表(将数据追加到表中已有的内容)

命令格式

Hologres当前版本仅支持以下copy语句
COPY table_name [ ( column_name [, ...] ) ]
    FROM STDIN
    [ [ WITH ] ( option [, ...] ) ]

   where option can be one of:

    FORMAT format_name
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    HEADER [ boolean ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column_name [, ...] ) | * }
    FORCE_NOT_NULL ( column_name [, ...] )

参数说明

  1. table_name:指定表名。
  2. STDIN :指定从客户端输入。
  3. FORMAT:支持text、csv格式,默认是text。
  4. DELIMITER:指定字段分隔符,默认为文本格式的制表符, CSV格式的逗号,如DELIMITER AS ','

使用示例

  1. 使用stdin导入数据
    -- 1.建表
    CREATE  TABLE copy_test (
      id    int,
      age   int,
      name  text
    ) ;
    
    --2. 导入数据(按回车键结束数据输入)
    
    COPY copy_test from stdin WITH DELIMITER AS ',' NULL AS '';
    53444,24,wangming
    55444,38,ligang
    55444,38,luyong
    \.
    
    --查数据
    select * from  copy_test;
  2. 使用stdin导入CSV格式
    -- 1. 建表
    create table partsupp ( ps_partkey          integer not null,
                            ps_suppkey     integer not null,
                            ps_availqty    integer not null,     
                            ps_supplycost  float  not null,
                            ps_comment     text not null );
    
    --2.导入数据
    copy partsupp from stdin with delimiter '|' csv;  
    1|2|3325|771.64|final theodolites 
    1|25002|8076|993.49|ven ideas
    \.
    
    --3.查数据
    select * from  partsupp;
  3. 利用CopyManager实现JDBC客户端文件导入
    package com.aliyun.hologram.test.jdbc;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.sql.*;
    import java.util.Properties;
    
    import org.postgresql.copy.CopyManager;
    import org.postgresql.core.BaseConnection;
    
    public class jdbcCopyFile {
    
        public static void main(String args[]) throws Exception {
            System.out.println(copyFromFile(getConnection(), "/Users/feng/Workspace/region.tbl", "region"));
        }
    
        public static Connection getConnection() throws Exception {
            Class.forName("org.postgresql.Driver");
            String url = "jdbc:postgresql://endpoint:port/dbname";
            Properties props = new Properties();
        //set db user
            props.setProperty("user", "AAA");//当前账号的access id
        //set db password
            props.setProperty("password", "BBB");//当前账号的access key
            return DriverManager.getConnection(url, props);
        }
    
        /**
         * 导入文件到数据库
         * 
         * @param connection
         * @param filePath
         * @param tableName
         * @return
         * @throws SQLException
         * @throws IOException
         */
        public static long copyFromFile(Connection connection, String filePath, String tableName)
                throws SQLException, IOException {
            long count = 0;
            FileInputStream fileInputStream = null;
    
            try {
                CopyManager copyManager = new CopyManager((BaseConnection) connection);
                fileInputStream = new FileInputStream(filePath);
                count = copyManager.copyIn("COPY " + tableName + " FROM STDIN delimiter '|' csv", fileInputStream);
            } finally {
                if (fileInputStream != null) {
                    try {
                        fileInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return count;
        }
    
    }

使用说明

  1. 数据类型支持
    当前仅支持以下数据类型:
    • int4
    • int8
    • float4
    • float8
    • float8
    • text
  2. 场景支持
    • 如果是分区表,只能往指定分区子表插入,不支持往分区父表COPY。
    • 当前版本仅支持COPY FROM STDIN,不支持COPY TO。
    • 暂不支持导入本地文件。
  3. 更多关于copy的用法请参见PostgreSQL官网文档copy